社区讨论

50分求助

P3990[SHOI2013] 超级跳马参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@loblwsc2
此快照首次捕获于
2023/10/29 23:09
2 年前
此快照最后确认于
2023/11/04 04:01
2 年前
查看原帖
求助,一直WA50分,改了好久了
CPP
#include<cstdio>
#include<cstring>
#define N 110
#define mo 30011
using namespace std;
int n,m;
struct ak{int mat[N][N];ak(){memset(mat,0,sizeof(mat));}}a,b;
void mem(ak &a){
	a.mat[1][2]=a.mat[1][1]=1;
	for(int i=2;i<n;i++)a.mat[i][i+1]=a.mat[i][i]=a.mat[i][i-1]=1;
	a.mat[n][n-1]=a.mat[n][n]=1;
	for(int i=1;i<=n;i++)a.mat[i][i+n]=a.mat[i+n][i]=1;
	return;
}
ak operator * (ak a,ak b){
	ak c;
	for(int i=1;i<=n*2;i++){
		for(int j=1;j<=n*2;j++){
			for(int k=1;k<=n*2;k++)c.mat[i][j]=(c.mat[i][j]+a.mat[i][k]*b.mat[k][j]%mo)%mo;
		}
	}
	return c;
}
ak operator ^ (ak a,int b){
	ak ans;
	for(int i=1;i<=n*2;i++)ans.mat[i][i]=1;
	while(b){
		if(b&1)ans=ans*a;
		a=a*a;b>>=1;
	}
	return ans;
}
int main(){
	scanf("%d%d",&n,&m);
	mem(a);
	b=a^(m-2);
	int ans=-b.mat[1][n*2];
	b=b*a;
	ans+=b.mat[1][n];
	printf("%d\n",ans);
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...