P1349 广义斐波那契数列

来源:互联网 发布:淘宝助理设置运费模板 编辑:程序博客网 时间:2024/06/08 14:30

QAQ
类似于之前的斐波那契数列,不过这次是广义的。
F(n)=p*F(n-1)+q* F(n-2)
但是数据量太大,还是使用矩阵加速,看一下这次的递推矩阵
|F(n),F(n-1)|=|F(n-1),F(n-2)|*|p,1|
             |q,0|
套路跟前面的题一样,根据递推矩阵初始化就行了

#include <cstdio>#include <iostream>#define ll long longusing namespace std;ll ans[2][3];ll x[3][3];ll c[3][3];ll m;void ans_cf(){    for(int i=1;i<=1;i++)     for(int j=1;j<=2;j++)      c[i][j]=ans[i][j],ans[i][j]=0;    for(int i=1;i<=1;i++)     for(int j=1;j<=2;j++)      for(int k=1;k<=2;k++)       ans[i][j]=(ans[i][j]+(c[i][k]*x[k][j])%m)%m;}void x_cf(){    for(int i=1;i<=2;i++)     for(int j=1;j<=2;j++)      c[i][j]=x[i][j],x[i][j]=0;    for(int i=1;i<=2;i++)     for(int j=1;j<=2;j++)      for(int k=1;k<=2;k++)       x[i][j]=(x[i][j]+(c[i][k]*c[k][j])%m)%m;  }void fast_pow(int k){    while(k)    {        if(k%2) ans_cf();        x_cf();        k/=2;    }}int main(){    ll p,q,a1,a2,n;    scanf("%lld%lld%lld%lld%lld%lld",&p,&q,&a1,&a2,&n,&m);    if(n==1)    {        printf("%lld",a1%m);        return 0;    }    if(n==2)    {        printf("%lld",a2%m);        return 0;    }    x[1][1]=p,x[1][2]=1,x[2][1]=q;    ans[1][1]=a2,ans[1][2]=a1;    n-=2;    fast_pow(n);    printf("%lld",ans[1][1]%m);}
原创粉丝点击