[P1349]广义斐波那契数列

来源:互联网 发布:柯洁评论黑嘉嘉 知乎 编辑:程序博客网 时间:2024/06/16 05:01

原题链接

总之
就是用矩阵
来个快速幂加速一下

#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>#include<cmath>#include<queue>#include<vector>#include<climits>#include<string>#include<cstdlib>#include<ctime>#define LL long long#define MOD 1000000007using namespace std;struct nico{    LL p[5][5];}d,ans,yumi;LL p,q,a1,a2,n,m;nico operator * (nico a,nico b){    int i,j,k;    nico c;    memset(c.p,0,sizeof(c.p));    for(i=1;i<=2;i++)        for(j=1;j<=2;j++)            for(k=1;k<=2;k++)                c.p[i][j]+=(a.p[i][k]*b.p[k][j])%m;    return c;}nico fastpow(nico pika,LL x){    while(x!=1)    {        if(x%2==1) yumi=yumi*pika;        x=x>>1;        pika=pika*pika;    }    return yumi*pika;}int main(){    int i;    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;           }    for(i=1;i<=2;i++)        yumi.p[i][i]=1;    d.p[1][1]=p;    d.p[2][1]=q;    d.p[1][2]=1;    d.p[2][2]=0;    nico mid=fastpow(d,n-2);    ans.p[1][1]=a2;    ans.p[1][2]=a1;    LL kkk=ans.p[1][1]*mid.p[1][1]+ans.p[1][2]*mid.p[2][1];    printf("%lld",kkk%m);    return 0;} 
原创粉丝点击