Fib数列问题(项数很大)
用fib(n)表示斐波那契数列的第n项,现在要求你求fib(n) mod m。fib(1)= 1, fib(2)= 1。
输入格式
输入2个整数n(1≤n≤1018), m(2≤m≤10000000)。
输出格式
输出fib(n)对m取模的值。
样例输入1
4 10
样例输出1
3
样例输入2
100000000 100000000
样例输出2
60546875
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long LL; 4 5 struct matrix 6 { 7 LL a[105][105]; 8 }; 9 matrix matrix_mul(matrix A, matrix B, LL mod)// 2 个矩阵相乘 10 { 11 matrix C; 12 int i,j,k; 13 for(i=0;i<=1;i++) 14 { 15 for(j=0;j<=1;j++) 16 { 17 C.a[i][j]=0; 18 for(k=0;k<=1;k++) 19 { 20 C.a[i][j]+=A.a[i][k]*B.a[k][j]%mod; 21 C.a[i][j]%=mod; 22 } 23 } 24 } 25 return C; 26 } 27 matrix unit() // 返回一个单位矩阵 28 { 29 matrix res; 30 int i,j; 31 for(i=0;i<=1;i++) 32 { 33 for(j=0;j<=1;j++) 34 { 35 if(i==j) 36 res.a[i][j]=1; 37 else 38 res.a[i][j]=0; 39 } 40 } 41 return res; 42 } 43 matrix matrix_pow(matrix A, LL n, LL mod)// 快速求矩阵 A 的 n 次方 44 { 45 matrix res=unit(),temp=A; 46 for(;n;n/=2) 47 { 48 if(n&1) 49 res=matrix_mul(res,temp,mod); 50 temp=matrix_mul(temp,temp,mod); 51 } 52 return res; 53 } 54 55 int main() 56 { 57 LL n,m; 58 scanf("%lld %lld",&n,&m); 59 if(n<3) 60 printf("1\n"); 61 else 62 { 63 matrix A,B,C; 64 A.a[0][0]=1; A.a[0][1]=1; 65 A.a[1][0]=1; A.a[1][1]=0; 66 B.a[0][0]=1; 67 B.a[1][0]=1; 68 C=matrix_mul( matrix_pow(A,n-2,m), B, m); 69 printf("%lld\n", C.a[0][0]); 70 } 71 return 0; 72 }
-