关于64pts做法的溢出问题
查看原帖
关于64pts做法的溢出问题
101000
Dark_X楼主2020/11/1 11:18

为什么边乘边取模会溢出?

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define mod 998244353
using namespace std;

int n,m;
int a[50][5],dp[50][50][50];

int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i)
		for(int j=1;j<=m;++j)
			scanf("%d",&a[i][j]);
	dp[0][0][0]=1;
	for(int i=1;i<=n;++i)
		for(int j=i;j>=0;--j)
			for(int k=i;k>=0;--k)
				for(int l=i;l>=0;--l){
				int x,y,z;
				if(a[i][1]&&j){
					x=(dp[j-1][k][l]%mod*a[i][1]%mod)%mod;
					dp[j][k][l]=(dp[j][k][l]%mod+x%mod)%mod;
				}
				if(a[i][2]&&k){
					y=(dp[j][k-1][l]%mod*a[i][2]%mod)%mod;
					dp[j][k][l]=(dp[j][k][l]%mod+y%mod)%mod;
				}
				if(a[i][3]&&l){
					z=(dp[j][k][l-1]%mod*a[i][3]%mod)%mod;
					dp[j][k][l]=(dp[j][k][l]%mod+z%mod)%mod;
				}
			}
	int res=0;
	for(int i=0;i<=n;++i)
		for(int j=0;j<=n;++j)
			for(int k=0;k<=n;++k){
				int s=i+j+k,d=s/2;
				if(s>0&&s<=n&&i<=d&&j<=d&&k<=d) res=(res%mod+dp[i][j][k]%mod)%mod;
			}
	printf("%d",res);
	return 0;
}
2020/11/1 11:18
加载中...