题解:AT_abc422_g [ABC422G] Balls and Boxes
reinforest · · 题解
第一问可以构造 OGF:
仍然可以直接卷积,注意卷积的时候带上阶乘。最后计算
注意到
#include<bits/stdc++.h>
#include<atcoder/all>
#define ll atcoder::modint998244353
using namespace std;
constexpr int N=3e5+5;int n,a,b,c;
vector<ll> f,g,h;ll fac[N];
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>n>>a>>b>>c;
f.resize(n+1);g.resize(n+1);h.resize(n+1);
fac[0]=ll(1);
for(int i=0;i<=n;i++){
f[i]=(i%a==0);g[i]=(i%b==0);h[i]=(i%c==0);
if(i!=0)fac[i]=fac[i-1]*(ll(i));
}
f=convolution(f,g);
f=convolution(f,h);
cout<<f[n].val()<<"\n";
for(int i=0;i<=n;i++)f[i]=(i%a==0?fac[i].inv():0),g[i]=(i%b==0?fac[i].inv():0),h[i]=(i%c==0?fac[i].inv():0);
f=convolution(f,g);f=convolution(f,h);
cout<<((f[n]*fac[n]).val())<<"\n";
return 0;
}