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 }

-

猜你喜欢

转载自www.cnblogs.com/jiamian/p/12227731.html
fib