ZOJ4114 Flipping Game(2019山东省赛)

有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;
} 

猜你喜欢

转载自www.cnblogs.com/zhanglichen/p/12306931.html