您的位置:首页 > 其它

P1349 广义斐波那契数列

2017-08-16 16:58 357 查看
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 long
using 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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: