您的位置:首页 > 产品设计 > UI/UE

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

2016-10-31 21:30 519 查看

题目链接

题意:给出

F[1]和F[2],F[i]=F[i−1]+F[i−2]∗2+i4

求F

思路:明显的构造矩形快速幂,将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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  矩阵快速幂