ABC405E题解
首先考虑最左侧的葡萄的左侧,肯定是 \(A\) 个苹果,\(B\) 个橙子,\(i\) 根香蕉,因为题目规定苹果和橙子一定要在所有葡萄左边,所以是 \(A\) 个苹果,\(B\) 个橙子,但是所有香蕉不一定都在所有葡萄的左边,所以会有 \(i\) 根香蕉,\(i\) 是个未知数,然后考虑最左侧葡萄的右侧,肯定是 \(D-1\) 个葡萄和 \(C-i\) 根香蕉,然后把左侧和右侧的方案数乘起来就行了,但是怎么算左侧和右侧的方案数呢?很简单,左侧的方案数实际上就是 \(C_{A+B+i}^B\),因为题目规定所有苹果一定要放在所有香蕉的左边,所以苹果和香蕉的位置是固定的,只需要插入 \(B\) 个橙子即可,其实就是有 \(A+B+i\) 这么多个位置,只有 \(B\) 个位置能用,问有多少种方案,所以就是 \(C_{A+B+i}^B\),右侧更简单,因为没有任何约束,所以就是 \(C_{D-1+C-i}^{D-1}\) 或者 \(C_{D-1+C-i}^{C-i}\),这两个东西是一样。
代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 3e6+5;
const int mod = 998244353;
int jie[N];
int fac[N];
inline int pow(int a,int b,int p)
{
int ans = 1;
while(b)
{
if(b&1)
{
ans = ans*a%p;
}
a = a*a%p;
b>>=1;
}
return ans;
}
signed main()
{
jie[0] = 1;
int a,b,c,d;
scanf("%lld %lld %lld %lld",&a,&b,&c,&d);
for(int i = 1;i<=3e6;i++)
{
jie[i] = jie[i-1]*i%mod;
}
fac[(int)3e6] = pow(jie[(int)3e6],mod-2,mod);
for(int i = 3e6-1;i>=0;i--)
{
fac[i] = fac[i+1]*(i+1)%mod;
}
long long ans = 0;
for(int i = 0;i<=c;i++)
{
ans = (ans+jie[a+b+i]*fac[b]%mod*fac[a+i]%mod*jie[c-i+d-1]%mod*fac[d-1]%mod*fac[c-i]%mod)%mod;
}
printf("%lld",ans);
return 0;
}

浙公网安备 33010602011771号