抽象的快读tle
  • 板块P5175 数列
  • 楼主dbycs11
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/5/29 09:37
  • 上次更新2024/5/29 15:32:39
查看原帖
抽象的快读tle
473992
dbycs11楼主2024/5/29 09:37

由于题目数据很大,本菜鸡使用了快读

#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了。

请各位大佬帮忙看一下,快读有啥问题

2024/5/29 09:37
加载中...