1. Flipping Game
题意
给定n个灯的初始状态,每回合对m盏灯进行反转,求在k回合后达到指定状态的方案数。
心理路程
- 看到了k个回合,每回合m次反转,求方案数,用屁股想都是dp。
- 以为是状压dp,但是数据范围是100,意味着有2^100次方种状态,时间复杂度远远不够。任何企图枚举状态的方法,都会TLE。
教训
取模优先级整错了,wa了半天。
先加减乘除优先,后取模。
思路
- 求出需要按奇数次开关的个数为cnt,dp[i][j]表示第i回合,亮j盏灯的方案数,状态转移为dp[i + 1][j] += dp[i][x + num * 2 - m] * C[n - x][num] * C[x][m - num]。num是m盏要按的灯里,原本灭的个数,x是i回合亮灯数。
- 初始化dp[0][0] = 1,最后的结果要除以C[n][cnt],取模意义下要乘其逆元。或者初始化dp[0][cnt] = 1,最后的dp[round][0]就是答案。
/*
* Author: Chen_zhuozhuo
* Created Time: 2020/4/29 11:31:14
* File Name: a.cpp
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <time.h>
#define rep(i,a,b) for(ll i=(a);i<=(b);i++)
#define per(i,a,b) for(ll i=(a);i>=(b);i--)
using namespace std;
typedef long long ll;
typedef pair<ll,ll> PII;
const ll maxll = -1u>>1;
const ll inf = 0x3f3f3f3f;
const ll maxn = 105;
ll n,k,m;
char a[maxn], b[maxn];
ll dp[maxn][maxn];
ll c[maxn][maxn];
ll MOD = 998244353;
///mod优先级低,先乘除后取模
void print(){
for(int i=0;i<=k;i++){
cout<<i<<"th: ";
for(int j=0;j<=n;j++){
cout<<dp[i][j]<<' ';
}
cout<<endl;
}
}
int main() {
ios::sync_with_stdio(false);
ll t;cin>>t;
for(int i=0;i<maxn;i++) //求组合数
for(int j=0;j<=i;j++) c[i][j]=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; //要取模!
while(t --){
//len, round, times
memset(dp, 0, sizeof(dp));
cin>>n>>k>>m;
cin>>a + 1>> b + 1;
ll cnt = 0;
for(ll i=1;i<=n;i++){
a[i] = ((a[i] - '0') ^ (b[i] - '0')) + '0';
if(a[i] == '1'){
cnt ++;
}
}
dp[0][cnt] = 1;
for(ll i=0; i<k; i++){ //回合数
for(ll x=0; x<=n; x++){ //当前回合亮灯数
for(ll num=0; num<=m; num++){ //选取的,原本为暗的数量
if(x + num * 2 - m <= n && x + num * 2 - m >= 0){
dp[i + 1][x + num * 2 - m] = dp[i + 1][x + num * 2 - m] + dp[i][x] * (c[n - x][num] * c[x][m - num] % MOD) % MOD;
dp[i + 1][x + num * 2 - m] %= MOD;
}
}
}
}
//print();
cout<<dp[k][0]<<endl;
}
return 0;
}
/*
Sample Input
3
3 2 1
001
100
3 1 2
001
100
3 3 2
001
100
Sample Output
2
1
7
*/