mod要改正long long 才对 不知道为什么
自己尝试了一下
只有mod是质数的情况 mod用int 或long long 输出用long long的结果一样
剩下的是相同的
代码如下
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
struct Matrix
{
long long m[7][7];
void init() {
memset(m,0,sizeof(m));
for(int i=0;i<7;i++) {
m[i][i]=1;
}
}
};
const long long mod=2147493647;
int t,n;
long long a,b;
Matrix p={ 1,1,0,0,0,0,0,
2,0,0,0,0,0,0,
1,0,1,0,0,0,0,
4,0,4,1,0,0,0,
6,0,6,3,1,0,0,
4,0,4,3,2,1,0,
1,0,1,1,1,1,1,
};
Matrix mul(Matrix a,Matrix b)
{
Matrix c;
for(int i=0;i<7;i++) {
for(int j=0;j<7;j++) {
c.m[i][j]=0;
for(int k=0;k<7;k++) {
c.m[i][j]=(c.m[i][j]+(a.m[i][k]*b.m[k][j]%mod))%mod;
}
}
}
return c;
}
Matrix q_pow(int b)
{
Matrix base= p;
Matrix ans; ans.init();
while(b) {
if(b&1) ans=mul(ans,base);
base=mul(base,base);
b>>=1;
}
return ans;
}
int main()
{
scanf("%d",&t);
while(t--) {
scanf("%d%lld%lld",&n,&a,&b);
if(n==1) {
printf("%lld\n",a);
}
else if(n==2) {
printf("%lld\n",b);
}
else{
Matrix ans={b,a,16,8,4,2,1};
Matrix temp=q_pow(n-2);
ans=mul(ans,temp);
printf("%lld\n",ans.m[0][0]);
}
}
}