Submission #14655

#TimeUsernameProblemLanguageResultExecution timeMemory
14655dohyun0324선다형 시험 (TOKI14_multiple)C++98
100 / 100
12 ms32844 KiB
#include<stdio.h> #define Mod 1000000007 int w2,n,p,q,w,a[2010],b[2010],ch[2010][6],w1,same[2010],dif[2010],cnt2[2010]; long long invfact[4010],t,dap,cnt,d1[2010],d[2010],dif1[2010],dp[2010][2010],fact[4010]; char x2,c[7]; long long comb(int n,int r) { if(r==0) return 1; long long s; s=fact[n]*invfact[r]; s%=Mod; s*=invfact[n-r]; s%=Mod; return s; } long long pow(long long x,long long b) { long long c=x,ans=1; while(b) { if(b%2) ans*=c; b/=2; c*=c; c%=Mod; ans%=Mod; } return ans; } int main() { int i,j,x; scanf("%d %d %d",&n,&p,&q); fact[0]=1; invfact[0]=1; for(i=1;i<=4000;i++){fact[i]=fact[i-1]*i; fact[i]%=Mod;} for(i=1;i<=4000;i++) invfact[i]=pow(fact[i],Mod-2); for(i=1;i<=n;i++){ scanf(" %c",&x2); a[i]=x2-'a'+1; } for(i=1;i<=n;i++){ scanf(" %c",&x2); b[i]=x2-'a'+1; } for(i=1;i<=n;i++){ scanf("%s",&c); for(j=0;j<=4;j++){ if(c[j]!='.') ch[i][j+1]=1, cnt2[i]++; } } for(i=1;i<=n;i++){ if(a[i]==b[i]) same[++w]=i; else{ if(ch[i][b[i]]) dif1[++w1]=cnt2[i]-2; } } dp[0][0]=1; for(i=1;i<=w;i++){ x=same[i]; cnt=0; for(j=1;j<=5;j++){ if(ch[x][j]) cnt++; } if(ch[x][a[x]]) dp[i][0]=dp[i-1][0]*(cnt-1); else dp[i][0]=dp[i-1][0]*cnt; dp[i][0]%=Mod; for(j=1;j<=i;j++){ if(ch[x][a[x]]) dp[i][j]=dp[i-1][j-1]+dp[i-1][j]*(cnt-1); else dp[i][j]=dp[i-1][j]*cnt; dp[i][j]%=Mod; } } for(i=0;i<=w;i++) d[i]=dp[w][i]; for(i=1;i<=w1;i++) { dp[i][0]=dp[i-1][0]*dif1[i]; dp[i][0]%=Mod; for(j=1;j<=i;j++) { dp[i][j]=dp[i-1][j]*dif1[i]+dp[i-1][j-1]; dp[i][j]%=Mod; } } for(i=0;i<=w1;i++) d1[i]=dp[w1][i]; for(i=0;i<=p && i<=q;i++) { if(p+q-i*2<=w1) { t=d1[p+q-i*2]; t%=Mod; t*=comb(p+q-i*2,p-i); t%=Mod; t*=d[i]; t%=Mod; dap+=t; dap%=Mod; } } printf("%lld",dap); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...