题意:给出
F [ 1 ] 和 F [ 2 ] , F [ i ] = F [ i − 1 ] + F [ i − 2 ] ∗ 2 + i 4
求F[n]
思路:明显的构造矩形快速幂,将n^4展开就好了
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&1 LL) {
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 ;
}