斐波那契前n项和

斐波那契前n项和

# 题意

求出斐波那契的前n项和

1 ≤ n ≤ 210

# 题解 

数据范围很大只能接受 O (√n) 或者 O(log n)的

矩阵递推加速,F(n) 三维向量表示{ f(n) ,f(n+1) ,s(n) }

每次乘矩阵

      0   1    0

A=  1    1    1

      0   0    1

即可,即F(0) · An

快速幂即可以达到O(33logn)

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 const int N=2e6;
 5 int n,mod;
 6 void mul(int f[3],int a[3][3]){
 7     int c[3];
 8     memset(c,0,sizeof c);
 9     for(int i=0;i<3;i++)
10         for(int k=0;k<3;k++)
11             c[i]=(c[i]+((ll)f[k]*a[k][i])%mod)%mod;
12     memcpy(f,c,sizeof c);
13 }
14 void mulself(int a[3][3]){
15     int c[3][3];
16     memset(c, 0, sizeof c);
17     for (int i = 0; i < 3; i++) {
18         for (int j = 0; j < 3; j++)
19             for (int k = 0; k < 3; k++)
20                 c[i][j] = (c[i][j] + (ll) a[i][k] * a[k][j]) % mod;
21     }
22     memcpy(a, c, sizeof c);
23 }
24 int main(){
25     cin>>n>>mod;
26     int a[3][3]={
27         {0,1,0},
28         {1,1,1},
29         {0,0,1}
30     };
31     int f[3]={0,1,0};
32     while(n){
33         if(n&1) mul(f,a);
34         mulself(a);
35         n>>=1;
36     }
37     cout<<f[2]<<endl;
38 }

猜你喜欢

转载自www.cnblogs.com/hhyx/p/12709924.html