95pts求调,悬赏一关
  • 板块P2182 翻硬币
  • 楼主Tjaweiof
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/7/26 10:55
  • 上次更新2024/7/26 11:56:06
查看原帖
95pts求调,悬赏一关
550933
Tjaweiof楼主2024/7/26 10:55

RT

#include <bits/stdc++.h>
using namespace std;
#define FILE(x) freopen(x".in", "r", stdin);freopen(x".out", "w", stdout);
const int mod = 1e9 + 7;
int n, m, k, a[101], b[101], cnt;
long long fact[101], dp[101][101];
void init(){
	fact[0] = 1;
	for (int i = 1; i <= 100; i++){
		fact[i] = fact[i - 1] * i % mod;
	}
	return;
}
long long qpow(long long a, long long b){
	long long res = 1;
	while (b){
		if (b & 1){
			res *= a;
			res %= mod;
		}
		a *= a;
		a %= mod;
		b = b >> 1;
	}
	return res;
}
long long C(long long n, long long m){
	return fact[n] * qpow(fact[m], mod - 2) % mod * qpow(fact[n - m], mod - 2) % mod;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	init();
	char c;
	cin >> n >> m >> k;
	for (int i = 1; i <= n; i++){
		cin >> c;
		a[i] = c - 48;
	}
	for (int i = 1; i <= n; i++){
		cin >> c;
		b[i] = c - 48;
		if (a[i] == b[i]){
			cnt++;
		}
	}
	dp[0][cnt] = 1;
	for (int i = 1; i <= m; i++){
		for (int j = 0; j <= n; j++){
			for (int l = 0; l <= k; l++){
				int tmp = j - (l << 1) + k;
				if (tmp < 0 || tmp > n){
					continue;
				}
				dp[i][j] += dp[i - 1][tmp] * C(n - tmp, l) % mod * C(tmp, k - l) % mod;
				dp[i][j] %= mod;
			}
		}
	}
	cout << dp[m][n];
	return 0;
}

2024/7/26 10:55
加载中...