专栏文章

ABC405E

AT_abc405_e题解参与者 8已保存评论 8

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
8 条
当前快照
1 份
快照标识符
@mipcapnh
此快照首次捕获于
2025/12/03 09:40
3 个月前
此快照最后确认于
2025/12/03 09:40
3 个月前
查看原文
这题第一眼看上去就数学。
首先我们需要做在 a+ba+b 里放置 aa 个相同的物品和b个相同的物品的不同情况数。
这个的很显然等同于在 a+ba+b 个空位中放 aa 个物品的组合数,即 Caa+bC^{a+b}_{a}
接着我们从头考虑这个问题,苹果和橙子肯定是放在最开始的,但是它们之间的顺序是不确定的所以需要计算一下。
接着我们来看橙子,它被要求在葡萄之后,但是它和香蕉的顺序是不固定的。
然后看到葡萄,它被要求在橙子和苹果之后,所以相当于确定了苹果和橙子后它就基本上固定了,但是它和香蕉的顺序也是不固定的。
那么我们可以发现只需要枚举一下有多少个橙子在苹果之后然后就相当于在确定的橙子和葡萄中放置橙子。
这题就做完了。自认为思路比较清新。
放个代码:
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=998244353,N=4e6;
int qpow(int a,int b){
    int res=1;a%=mod;
    while(b){
        if(b%2)res=res*a%mod;
        a=a*a%mod,b>>=1;
    }
    return res;
}
int A[N+1],inva[N+1];
int C(int a,int b){
	if(!a||!b)return 1;
	return A[a+b]*inva[a]%mod*inva[b]%mod;
}
int a,b,c,d,ans;
signed main(){
	A[0]=1,A[1]=1;
	for(int i=1;i<=N;i++)A[i]=A[i-1]*i%mod,inva[i]=qpow(A[i],mod-2);
	cin>>a>>b>>c>>d;
	for(int i=0;i<=b;i++)ans+=C(a-1,i)*C(b+d-i,c)%mod,ans%=mod;
	cout<<ans;
	
}

注意代码中的 CC 函数并不等同于组合数。

评论

8 条评论,欢迎与作者交流。

正在加载评论...