Codeforces Round #277.5 (Div. 2)部分题解(四)
de
#include
#include
#include
#include
#include
#include
using namespace std; typedef long long LL; const int maxn = 500+10; #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define pb push_back LL d[maxn][maxn],n,m,mod; bool vis[maxn][maxn]; int col[maxn]; char s[maxn]; LL cn2(LL n){ return n*(n-1)/2; } LL dfs(LL x,LL y){//当前还有x列为1,y列为0,到达目标状态的方案种数,之所以是每次选2个是因为每行的和都必须为2 if(x==0&&y==0)return 1; if(vis[x][y])return d[x][y]; d[x][y]=0; vis[x][y]=1; if(x>=2)d[x][y]+=cn2(x)*dfs(x-2,y)%mod;//选出为1的两列让其加上1,此时和为1的为x-2,和为0的为y if(y>=2)d[x][y]+=cn2(y)*dfs(x+2,y-2)%mod;//选出为0的两列让其加上1,此时和为1的为x+2,和为0的为y-2 if(x>=1&&y>=1)d[x][y]+=x*y*dfs(x,y-1)%mod;//各选一列加上1,此时和为1的为x,和为0的为y-1 return d[x][y]%=mod; } int main(){ ios_base::sync_with_stdio(false); cin.tie(0); while(cin>>n>>m>>mod){ memset(vis,0,sizeof vis); memset(col,0,sizeof col); rep(i,1,m){ cin>>s; for(int j=0;j
2){ cout<<0<