有n个开关,有起始状态和终状态,问如果每次必须选m个开关进行改变状态,一共进行k次,那么有多少种方式可以从起始状态到终状态~
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=1014; const int mod=998244353; ll dp[maxn][maxn]; ll c[maxn][maxn];//组合数 char s1[maxn]; char s2[maxn]; int main () { for (int i=0;i<maxn;i++) c[i][0]=1; for (int i=1;i<maxn;i++) c[i][i]=1; for (int i=2;i<maxn;i++) { for (int j=1;j<i;j++) { c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod; } } int t,n,k,m; scanf ("%d",&t); while (t--) { scanf ("%d %d %d %s %s",&n,&k,&m,s1,s2); int num=0; for (int i=0;i<n;i++) if (s1[i]!=s2[i]) num++; memset (dp,0,sizeof(dp)); dp[0][num]=1; for (int i=0;i<k;i++) { for (int j=0;j<=n;j++) { for (int k=0;k<=m;k++) { if (j>=k&&n-j>=m-k) { dp[i+1][j-k+m-k]+=dp[i][j]*c[j][k]%mod*c[n-j][m-k]%mod; dp[i+1][j-k+m-k]%=mod; } } } } printf ("%lld\n",dp[k][0]); } return 0; }