题面:
彩球的左右可以用0×k+1×k+0×k+……1×k的字符串表示(简称01字符串),而t+1则等于相邻两字符不同的个数,我们只需要分别在左边盒子和右边盒子用隔板法分别计算最后相乘取模即可,随后加上10字符串的情况取模就是答案,要注意盒子中球的个数为0的特判。
代码附下
ll fz[N], fm[N];
ll mod = 998244353;
ll ksm(ll x, ll y) {
ll res = 1;
while (y) {
if(y & 1) res = res * x % mod;
y >>= 1;
x = x * x % mod;
}
return res;
}
ll inv(ll x) {
return ksm(x, mod - 2);
}
void init() {
ll w = N - 10;
fz[0] = fm[0] = 1;
for (ll i = 1; i <= w; i++) {
fz[i] = fz[i - 1] * i;
fz[i] %= mod;
}
fm[w] = inv(fz[w]);
for (ll i = w - 1; i >= 1; i--) {
fm[i] = fm[i + 1] * (i + 1);
fm[i] %= mod;
}
}
ll C(ll n, ll m) {
if(n < m) return 0;
return fz[n] * fm[m] % mod * fm[n - m] % mod;
}
void solve()
{
ll n,x,t,sum,a,b,ans=0;
cin>>n>>x>>t;
sum=t+1;
if(sum>n)
{
cout<<0<<endl;
return;
}
a=(sum+1)/2;
b=sum/2;
if(b==0&&n-x==0)
ans+=C(x-1,a-1)%mod;
else ans+=C(x-1,a-1)*C(n-x-1,b-1)%mod;
if(a==0&&n-x==0)
ans=(ans+C(x-1,b-1))%mod;
else ans=(ans+C(x-1,b-1)*C(n-x-1,a-1)%mod)%mod;
cout<<ans<<endl;
}
如有错误烦请指正谢谢

京公网安备 11010502036488号