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

Posted hhyx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了佳佳的斐波那契(等差系数斐波那契和相关的知识,希望对你有一定的参考价值。

佳佳的斐波那契

# 题意

给定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 }

 

以上是关于佳佳的斐波那契(等差系数斐波那契和的主要内容,如果未能解决你的问题,请参考以下文章

斐波那契数列递归实现

python的递归算法学习:具体实现:斐波那契和其中的陷阱

斐波那契数列Fibonacci问题

介绍下斐波那契数列。

递归优化的斐波那契数列

斐波那契数列(递归非递归算法)