CF1615F LEGOndary Grandmaster (组合数)
计数好题,转换条件+转化贡献+组合数
首先题目的操作没有什么好的性质,考虑一个经典的 trick,将奇数位置上的数字取反,于是题目的操作变成
转化完条件,能使
设
但是这么做在有问号的情况下并不好计算,考虑另一个 trick,我们将贡献转化成每一个空隙被跨过的次数。也就是对于每个
枚举每个间隙计算答案,考虑枚举左边的差值,不妨设
这个形式可以用范德蒙德卷积,化成一个组合数:
于是得到了
#include <bits/stdc++.h>
#define pii std::pair<int, int>
#define fi first
#define se second
#define pb push_back
typedef long long i64;
const int N = 2010, mod = 1000000007;
i64 s[N], t[N], ps[3], pt[3], ss[3], st[3];
i64 fac[N << 1], inv[N << 1];
i64 qpow(i64 a, i64 b) {
i64 ret = 1;
while(b) {
if(b & 1) ret = ret * a % mod;
a = a * a % mod;
b >>= 1;
}
return ret;
}
void init() {
fac[0] = 1;
for(int i = 1; i <= (N << 1) - 10; i++) fac[i] = fac[i - 1] * i % mod;
inv[(N << 1) - 10] = qpow(fac[(N << 1) - 10], mod - 2);
for(int i = (N << 1) - 11; i >= 0; i--) inv[i] = inv[i + 1] * (i + 1) % mod;
}
i64 C(i64 n, i64 m) {
if(m < 0 || m > n) return 0;
return fac[n] * inv[m] % mod * inv[n - m] % mod;
}
void Solve() {
int n;
std::cin >> n;
std::string a, b;
std::cin >> a >> b;
a = ' ' + a, b = ' ' + b;
for(int i = 1; i <= n; i++) {
if(a[i] == '?') s[i] = 2;
else s[i] = a[i] - '0';
if(b[i] == '?') t[i] = 2;
else t[i] = b[i] - '0';
if(!(i & 1)) continue;
if(s[i] == 0 || s[i] == 1) s[i] ^= 1;
if(t[i] == 0 || t[i] == 1) t[i] ^= 1;
}
// for(int i = 1; i <= n; i++) {
// std::cout << s[i] << " \n"[i == n];
// }
// for(int i = 1; i <= n; i++) {
// std::cout << t[i] << " \n"[i == n];
// }
for(int i = 0; i <= 2; i++) ps[i] = pt[i] = ss[i] = st[i] = 0;
for(int i = 1; i <= n; i++) ss[s[i]]++, st[t[i]]++;
i64 ans = 0;
for(int i = 1; i < n; i++) {
ss[s[i]]--, st[t[i]]--;
ps[s[i]]++, pt[t[i]]++;
for(i64 j = -n; j <= n; j++) {
i64 d = j - (ps[1] - pt[1]), d2 = j - (st[1] - ss[1]);
ans = (ans + C(ps[2] + pt[2], pt[2] + d) * C(ss[2] + st[2], st[2] - d2) % mod * abs(j) % mod) % mod;
}
}
std::cout << ans << "\n";
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
init();
int T;
std::cin >> T;
while(T--) Solve();
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具