由于题目数据很大,本菜鸡使用了快读
#include<iostream>
#include<cstdio>
#include<cstring>
#define int long long
using namespace std;
const bool T=true,F=!T;
const int MAXN=50+10,mod=1e9+7;
struct matrix
{
int A[MAXN][MAXN],n,m;
matrix operator*(const matrix &b)const
{
matrix c;
int p=b.m;c.n=n;c.m=p;
for(int i=1;i<=n;i++)
for(int j=1;j<=p;j++)
c.A[i][j]=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=p;j++)
for(int k=1;k<=m;k++)
c.A[i][j]=(A[i][k]%mod*b.A[k][j]%mod+c.A[i][j]%mod)%mod;
return c;
}
}a,ans;
int n,t,k,x,y,a1,a2,fft[5];
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*f;
}
matrix power(matrix a,int b)
{
matrix Ans;
memset(Ans.A,0,sizeof(Ans.A));
Ans.m=Ans.n=a.n;
for(int i=1;i<=a.n;i++)
Ans.A[i][i]=1;
while(b)
{
if(b&1)Ans=Ans*a;
a=a*a;
b>>=1;
}
return Ans;
}
void init(int a1,int a2,int x,int y)
{
ans.A[1][1]=(a1%mod*a1%mod)%mod;
ans.A[1][2]=a2%mod*a2%mod;ans.A[1][3]=a1%mod*a1%mod;ans.A[1][4]=a2%mod*a1%mod;
a.A[1][1]=a.A[2][1]=a.A[2][3]=1;
a.A[2][2]=x%mod*x%mod;a.A[3][2]=y%mod*y%mod;a.A[4][2]=2*x%mod*y%mod;
a.A[2][4]=x%mod;a.A[4][4]=y%mod;
}
signed main()
{
t=read();
while(t--)
{
memset(ans.A,0,sizeof(ans.A));memset(a.A,0,sizeof(a.A));
n=read();a1=read();a2=read();x=read();y=read();
fft[1]=(a1%mod*a1%mod)%mod,fft[2]=(a1%mod*a1%mod+a2%mod*a2%mod)%mod;
if(n<3){cout<<fft[n]<<"\n";continue;}
a.n=a.m=4;ans.n=1,ans.m=4;
init(a1,a2,x,y);
ans=ans*power(a,n-1);
printf("%lld\n",ans.A[1][1]);
}
return 0;
}
结果很抽象的全tle了
然后把快读删了改成scanf
#include<iostream>
#include<cstdio>
#include<cstring>
#define int long long
using namespace std;
const bool T=true,F=!T;
const int MAXN=10,mod=1e9+7;
struct matrix
{
int A[MAXN][MAXN],n,m;
matrix operator*(const matrix &b)const
{
matrix c;
int p=b.m;c.n=n;c.m=p;
for(int i=1;i<=n;i++)
for(int j=1;j<=p;j++)
c.A[i][j]=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=p;j++)
for(int k=1;k<=m;k++)
c.A[i][j]=(A[i][k]%mod*b.A[k][j]%mod+c.A[i][j]%mod)%mod;
return c;
}
}a,ans;
int n,t,k,x,y,a1,a2,fft[5];
/*inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*f;
}*/
matrix power(matrix a,int b)
{
matrix Ans;
memset(Ans.A,0,sizeof(Ans.A));
Ans.m=Ans.n=a.n;
for(int i=1;i<=a.n;i++)
Ans.A[i][i]=1;
while(b)
{
if(b&1)Ans=Ans*a;
a=a*a;
b>>=1;
}
return Ans;
}
void init(int a1,int a2,int x,int y)
{
ans.A[1][1]=(a1%mod*a1%mod)%mod;
ans.A[1][2]=a2%mod*a2%mod;ans.A[1][3]=a1%mod*a1%mod;ans.A[1][4]=a2%mod*a1%mod;
a.A[1][1]=a.A[2][1]=a.A[2][3]=1;
a.A[2][2]=x%mod*x%mod;a.A[3][2]=y%mod*y%mod;a.A[4][2]=2*x%mod*y%mod;
a.A[2][4]=x%mod;a.A[4][4]=y%mod;
}
signed main()
{
scanf("%lld",&t);
while(t--)
{
memset(ans.A,0,sizeof(ans.A));memset(a.A,0,sizeof(a.A));
scanf("%lld%lld%lld%lld%lld",&n,&a1,&a2,&x,&y);
fft[1]=(a1%mod*a1%mod)%mod,fft[2]=(a1%mod*a1%mod+a2%mod*a2%mod)%mod;
if(n<3){cout<<fft[n]<<"\n";continue;}
a.n=a.m=4;ans.n=1,ans.m=4;
init(a1,a2,x,y);
ans=ans*power(a,n-1);
printf("%lld\n",ans.A[1][1]);
}
return 0;
}
就ac了。
请各位大佬帮忙看一下,快读有啥问题