HDU-5950-Recursive sequence-矩阵快速幂

来源:互联网 发布:java 开源权限框架 编辑:程序博客网 时间:2024/05/29 15:28

题目链接

题意:给出

F[1]F[2]F[i]=F[i1]+F[i1]2+i4

求F[n]

思路:明显的构造矩形快速幂,将n^4展开就好了

#include<bits/stdc++.h>const long long mod = 2147493647;using namespace std;struct mat {    long long a[10][10];}ans,tt;mat mul(mat x,mat y) {    mat tt;    for(int i=1;i<=7;i++)        for(int j=1;j<=7;j++) {            tt.a[i][j]=0;            for(int k=1;k<=7;k++) {                tt.a[i][j]+=x.a[i][k]*y.a[k][j];                tt.a[i][j]%=mod;            }        }    return tt;}int main(){    int t;    long long a,b,n;    scanf("%d",&t);    while(t--) {        scanf("%lld%lld%lld",&n,&a,&b);        if(n==1) {            printf("%lld\n",a);            continue;        }        if(n==2) {            printf("%lld\n",b);            continue;        }        memset(ans.a,0,sizeof ans.a);        memset(tt.a,0,sizeof tt.a);        for(int i=1;i<=7;i++) {            ans.a[i][i]=1;        }        tt.a[1][1]=1;tt.a[1][2]=2;tt.a[1][3]=1;tt.a[1][4]=4;tt.a[1][5]=6;tt.a[1][6]=4;tt.a[1][7]=1;        tt.a[2][1]=1;        tt.a[3][3]=1;tt.a[3][4]=4;tt.a[3][5]=6;tt.a[3][6]=4;tt.a[3][7]=1;        tt.a[4][4]=1;tt.a[4][5]=3;tt.a[4][6]=3;tt.a[4][7]=1;        tt.a[5][5]=1;tt.a[5][6]=2;tt.a[5][7]=1;        tt.a[6][6]=1;tt.a[6][7]=1;        tt.a[7][7]=1;        n-=2;        while(n) {            if(n&1LL) {                ans=mul(ans,tt);            }            tt=mul(tt,tt);            n/=2;        }        long long tot=(ans.a[1][1]*b%mod+ans.a[1][2]*a%mod+ans.a[1][3]*16%mod+ans.a[1][4]*8%mod        +ans.a[1][5]*4%mod+ans.a[1][6]*2%mod+ans.a[1][7])%mod;        printf("%lld\n",tot);    }    return 0;}
0 0
原创粉丝点击