日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NYOJ 301 递推求值(矩阵快速幂)

發布時間:2025/3/16 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NYOJ 301 递推求值(矩阵快速幂) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

遞推求值

時間限制:1000?ms ?|? 內存限制:65535?KB 難度:4 描述

給你一個遞推公式:

f(x)=a*f(x-2)+b*f(x-1)+c

并給你f(1),f(2)的值,請求出f(n)的值,由于f(n)的值可能過大,求出f(n)對1000007取模后的值。

注意:-1對3取模后等于2

輸入
第一行是一個整數T,表示測試數據的組數(T<=10000)
隨后每行有六個整數,分別表示f(1),f(2),a,b,c,n的值。
其中0<=f(1),f(2)<100,-100<=a,b,c<=100,1<=n<=100000000 (10^9)
輸出
輸出f(n)對1000007取模后的值
樣例輸入
2 1 1 1 1 0 5 1 1 -1 -10 -100 3
樣例輸出
5 999896

分析:由于n的值比較大,所以常規方法肯定會超時。根據遞推式求第n個表達式的值時,通常用矩陣乘法來做。

本題要構造兩個矩陣,其中一個為矩陣A,作為初始矩陣

f2 ?0 ? 0
f1 ?0 ? 0
1 ? 0 ? 0

另一個為矩陣B

b ? a ? c
1 ? 0 ? 0
0 ? 0 ? 1

因為F(2)和F(1)是已知的,當n>=3時,每次都乘以矩陣B,就能推出下一個矩陣。而矩陣的第一行第一列的元素就是所求的結果。

所以利用矩陣快速冪能夠快速準確地求出結果。

#include<stdio.h> #include<string.h> #define mod 1000007 #define N 3 typedef long long LL; struct Matrix {LL mat[N][N]; };Matrix unit_matrix = {1, 0, 0,0, 1, 0,0, 0, 1 }; //單位矩陣Matrix mul(Matrix a, Matrix b) //矩陣相乘 {Matrix res;for(int i = 0; i < N; i++)for(int j = 0; j < N; j++){res.mat[i][j] = 0;for(int k = 0; k < N; k++){res.mat[i][j] += a.mat[i][k] * b.mat[k][j];res.mat[i][j] %= mod;}}return res; }Matrix pow_matrix(Matrix a, LL n) //矩陣快速冪 {Matrix res = unit_matrix;while(n != 0){if(n & 1)res = mul(res, a);a = mul(a, a);n >>= 1;}return res; }int main() {LL n, f1, f2, a, b, c, T;Matrix tmp, arr;scanf("%lld",&T);while(T--){scanf("%lld%lld%lld%lld%lld%lld",&f1, &f2, &a, &b, &c, &n);if(n == 0)printf("%lld\n",(f2-f1*b-c + mod)%mod);if(n == 1)printf("%lld\n",(f1+mod)%mod);else if(n == 2)printf("%lld\n",(f2+mod)%mod);else{memset(arr.mat, 0, sizeof(arr.mat));arr.mat[0][0] = f2; arr.mat[1][0] = f1; arr.mat[2][0] = 1;tmp.mat[0][0] = b; tmp.mat[0][1] = a; tmp.mat[0][2] = c;tmp.mat[1][0] = tmp.mat[2][2] = 1;tmp.mat[1][1] = tmp.mat[1][2] = tmp.mat[2][0] = tmp.mat[2][1] = 0;Matrix p = pow_matrix(tmp, n-2);p = mul(p, arr);LL ans = (p.mat[0][0] + mod) % mod;printf("%lld\n",ans);}}return 0; }

總結

以上是生活随笔為你收集整理的NYOJ 301 递推求值(矩阵快速幂)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。