引言
题目链接:https://ac.nowcoder.com/acm/contest/74362/F
思路
若要组成多个连续段,其一定是 a 和 b 交替出现的
即要组成 3 个连续段,一定是:
a ... b ... a ... 或者 b ... a ... b ...
所以要划分时,要分成 a 在最前面和 b 在最前面的情况。
假设要给 a 分为 k 段且 a 的数量为 x,则可以在 x - 1 个空隙里插 k - 1 个 “板”,将其分为 k 段。
所以只需要枚举,之后分为 a 在前和 b 在前的情况,分别求其组合数即可。
代码
#include <bits/stdc++.h>
#define ll long long
#define N 3000
ll fact[N];
const ll mod = 1e9 + 7;
ll qmi(ll a, ll b) {
ll res = 1;
while(b) {
if(b & 1) res = res * a % mod;
a = a * a % mod;
b >>= 1;
}
return res;
}
ll inv(ll x) {
return qmi(x, mod - 2);
}
ll C(int m, int n) {
if(n - m < 0 || n < 0) return 0;
return fact[n] * inv(fact[m]) % mod * inv(fact[n - m]) % mod;
}
int main() {
fact[0] = 1;
for (ll i = 1 ; i < N ; i ++ ) {
fact[i] = fact[i - 1] * i % mod;
}
ll x,y;
std::cin >> x >> y;
for (ll i = 1 ; i <= x + y ; i ++ ) {
int odd = (i + 1) / 2, even = i / 2;
ll ans = C(odd - 1, x - 1) % mod * C(even - 1, y - 1) % mod;
ans += C(odd - 1, y - 1) % mod * C(even - 1, x - 1) % mod;
ans %= mod;
std::cout << ans << '\n';
}
return 0;
}
标签:...,return,res,ll,小红,连续,fact,mod
From: https://www.cnblogs.com/NachoNeko/p/18008926