typedef struct { LL m[MAX][MAX]; } Matrix; LL a,b,c,n,f1,f2; Matrix P = {0,0,0, 0,0,0, 0,0,0, };//这个是更具你自己构造出来的矩阵 Matrix I = {0,0,0, 0,0,0, 0,0,0, };//这是初始状态的矩阵 Matrix matrixmul(Matrix a,Matrix b) //矩阵乘法 { LL i,j,k; Matrix c; for (i = 0 ; i < MAX; i++) for (j = 0; j < MAX; j++) { c.m[i][j] = 0; for (k = 0; k < MAX; k++) c.m[i][j] += (a.m[i][k] * b.m[k][j])%mod; c.m[i][j] = (c.m[i][j] + mod)%mod; } return c; } Matrix quickpow(int n) { Matrix m = P, b = I; while (n >= 1) { if (n & 1) b = matrixmul(b,m); n = n >> 1; m = matrixmul(m,m); } return b; }
附上模板题目:
给你一个递推公式:
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
2 1 1 1 1 0 5 1 1 -1 -10 -100 3
5 999896
我们的目的是要找到一个矩阵可以实现这个递推关系,于是就是要找这样一个矩阵A使得:
这个矩阵实际上也是很好找到的,A=
#include <iostream> #include <cstring> #include <queue> #include <cstdio> #include <algorithm> using namespace std; typedef long long LL; const LL MAX = 3; const LL mod = 1000007; typedef struct { LL m[MAX][MAX]; } Matrix; LL a,b,c,n,f1,f2; Matrix P = {0,0,0, 1,0,0, 0,1,1, }; Matrix I = {0,0,0, 0,0,0, 0,0,0, }; Matrix matrixmul(Matrix a,Matrix b) //矩阵乘法 { LL i,j,k; Matrix c; for (i = 0 ; i < MAX; i++) for (j = 0; j < MAX; j++) { c.m[i][j] = 0; for (k = 0; k < MAX; k++) c.m[i][j] += (a.m[i][k] * b.m[k][j])%mod; c.m[i][j] = (c.m[i][j] + mod)%mod; } return c; } Matrix quickpow(int n) { Matrix m = P, b = I; while (n >= 1) { if (n & 1) b = matrixmul(b,m); n = n >> 1; m = matrixmul(m,m); } return b; } int main() { #ifdef xxz freopen("in.txt","r",stdin); #endif LL T; scanf("%lld",&T); while(T--) { scanf("%lld%lld%lld%lld%lld%lld",&f1,&f2,&a,&b,&c,&n); P.m[0][1] = a, P.m[1][1] = b; I.m[0][0] = f1,I.m[0][1] = f2, I.m[0][2] = c; if(n == 1) printf("%lld\n",f1%mod%mod); else if(n == 2) printf("%d\n",f2%mod); else { Matrix temp = quickpow(n-2); if(temp.m[0][1]%mod >= 0) printf("%lld\n",(temp.m[0][1]%mod + mod)%mod); else printf("%lld\n",(temp.m[0][1]%mod + mod)%mod); } } return 0; }
原文:http://blog.csdn.net/u013445530/article/details/41877713