码迷,mamicode.com
首页 > 其他好文 > 详细

佳佳的斐波那契(等差系数斐波那契和

时间:2020-04-17 00:09:27      阅读:62      评论:0      收藏:0      [点我收藏+]

标签:wing   fine   enter   tar   turn   long   16px   void   c++   

佳佳的斐波那契

# 题意

给定n,m,求出 Tn = f(1)+2f(2)+......nf(n) 答案模m

# 题解

Tn = f(1)+2f(2)+......nf(n) 不好通过迭代计算

可以令Pn=nf(1)+(n-1)f(2)+......+f(n)

最后只要令n·Sn - Pn-1 即可

初始矩阵定为f(1)={1,1,1,0}

如果为f(1)={1,1,1,1} 那么需要计算矩阵的逆,比较麻烦,

可以直接令操作矩阵为

0 1 0 0
1  1 1 0
0 0 1 1
0 0 0 1

每次都是Pn=Sn+Pn-1 最后迭代到n就是Pn-1

 1 #include <bits/stdc++.h>
 2 #define faststd ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
 3 #define ll long long
 4 using namespace std;
 5 int n,mod;
 6 void mul(int f[4],int a[4][4]){
 7     int c[4];
 8     memset(c,0,sizeof c);
 9     for(int i=0;i<4;i++)
10         for(int k=0;k<4;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[4][4]){
15     int c[4][4];
16     memset(c,0,sizeof c);
17     for(int i=0;i<4;i++)
18         for(int j=0;j<4;j++)
19             for(int k=0;k<4;k++){
20                 c[i][j]=(c[i][j]+((ll)a[i][k]*a[k][j])%mod)%mod;
21             }
22     memcpy(a,c,sizeof c);
23 }
24 int main(){
25     faststd
26     cin>>n>>mod;
27     int a[4][4]={
28         {0,1,0,0},
29         {1,1,1,0},
30         {0,0,1,1},
31         {0,0,0,1}
32     };
33     int f[4]={1,1,1,0};
34     int k=n-1;
35     while(k){
36         if(k&1) mul(f,a);
37         mulself(a);
38         k>>=1;
39     }
40     cout<<((((ll)n * f[2]) % mod - f[3] % mod) % mod + mod) % mod<<endl;
41     return 0;
42 }

 

佳佳的斐波那契(等差系数斐波那契和

标签:wing   fine   enter   tar   turn   long   16px   void   c++   

原文地址:https://www.cnblogs.com/hhyx/p/12716774.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!