为什么开long long第11个点会TLE
查看原帖
为什么开long long第11个点会TLE
508177
GXYZY楼主2022/10/2 11:38
#include<bits/stdc++.h>
using namespace std;
struct matrix{
	long long h,l;//h代表行,l代表列
	int a[110][110];
}ans,wns;
long long n,m;
int mod=30011;
matrix times(matrix r,matrix c){
	matrix timesans;
	memset(timesans.a,0,sizeof(timesans.a));
	timesans.h=r.h;
	timesans.l=c.l;
	for(int i=1;i<=r.h;i++){
		for(int j=1;j<=c.l;j++){
			for(int q=1;q<=r.l;q++){
				timesans.a[i][j]=(timesans.a[i][j]+r.a[i][q]%mod*c.a[q][j]%mod)%mod;
			}
		}
	}
	return timesans;
}	
matrix mul(matrix x,long long y){
	matrix res;
	res.h=res.l=x.l;
	memset(res.a,0,sizeof(res.a));
	for(int i=1;i<=res.l;i++){
		res.a[i][i]=1;
	}
	for(;y;y>>=1){
		if(y&1) res=times(x,res);
		x=times(x,x);
	}
	return res;
}
matrix buildansup4(long long n){
	matrix temp;
	memset(temp.a,0,sizeof(temp.a));
	temp.h=1;
	temp.l=2*n;
	temp.a[1][1]=5;
	temp.a[1][2]=6;
	temp.a[1][3]=3;
	temp.a[1][4]=1;
	temp.a[1][n+1]=2;
	temp.a[1][n+2]=2;
	temp.a[1][n+3]=1;
	return temp;
}
matrix buildans3(){
	matrix temp;
	memset(temp.a,0,sizeof(temp.a));
	temp.h=1;
	temp.l=6;
	temp.a[1][1]=5;
	temp.a[1][2]=6;
	temp.a[1][3]=3;
	temp.a[1][4]=2;
	temp.a[1][5]=2;
	temp.a[1][6]=1;
	return temp;
}
matrix buildans2(){
	matrix temp;
	memset(temp.a,0,sizeof(temp.a));
	temp.h=1;
	temp.l=4;
	temp.a[1][1]=5;
	temp.a[1][2]=5;
	temp.a[1][3]=2;
	temp.a[1][4]=2;
	return temp;
}
matrix buildans1(){
	matrix temp;
	memset(temp.a,0,sizeof(temp.a));
	temp.h=1;
	temp.l=2;
	temp.a[1][1]=2;
	temp.a[1][2]=1;
	return temp;
}
matrix buildwns(long long n){
	matrix temp;
	temp.l=temp.h=2*n;
	memset(temp.a,0,sizeof(temp.a));
	for(int i=1;i<=n;i++){
		temp.a[i][i]=1;
		if(i-1>=1){
			temp.a[i][i-1]=1;
		}
		if(i+1<=n){
			temp.a[i][i+1]=1;
		}
	}
	for(int i=1;i<=n;i++){
		temp.a[i][n+i]=1;
	}
	for(int i=n+1;i<=2*n;i++){
		temp.a[i][i-n]=1;
	}
	return temp;
}
void printmatrix(matrix p){
	for(int i=1;i<=p.h;i++){
		for(int j=1;j<=p.l;j++){
			cout<<p.a[i][j]<<" ";
		}
		cout<<endl;
	}
} 
int main(){
	cin>>n>>m;
	if(m<=4){
		if(m==4){
			if(n==1){
				cout<<5;
				return 0;
			}
			if(n==2){
				cout<<6;
				return 0;
			}
			if(n==3){
				cout<<3;
				return 0;
			}
			if(n==4){
				cout<<1;
				return 0;
			}
		}
		if(m==3){
			if(n==1){
				cout<<2;
				return 0;
			}
			if(n==2){
				cout<<2;
				return 0;
			}
			if(n==3){
				cout<<1;
				return 0;
			}
		}
		if(m==2){
			if(n==1){
				cout<<1;
				return 0;
			}
			if(n==2){
				cout<<1;
				return 0;
			}
		}
		if(m==1){
			if(n==1){
				cout<<1;
				return 0;
			}
		}
		cout<<0;
		return 0;
	}
	if(n>=4){
		ans=buildansup4(n);
	}
	if(n==3){
		ans=buildans3();
	}
	if(n==2){
		ans=buildans2();
	}
	if(n==1){
		ans=buildans1();
	}
	wns=buildwns(n);
	// printmatrix(wns);
	// system("pause");
	wns=mul(wns,m-4);
	ans=times(ans,wns);
	printf("%lld",ans.a[1][n]%mod);
	// printmatrix(ans);
	return 0;
}

代码第5行和第8行如果改为long long就会第11个点TLE但是开int就A了,求大佬帮忙看看

2022/10/2 11:38
加载中...