newcoder contest 114 B - 求值2
记得这是一个组合数卷积的板子题。
∑ C(A,i) * C(B,D-i) = C(A+B,D)
然后就直接做了。
#include<cstdio> #include<cctype> #include<algorithm> #define ll long long using namespace std; const int maxn=2000000,ha=998244353; inline void ADD(int &x,int y){ x+=y; if(x>=ha) x-=ha;} inline int ksm(int x,int y){ int an=1; for(;y;y>>=1,x=x*(ll)x%ha) if(y&1) an=an*(ll)x%ha; return an; } int jc[maxn+5],ni[maxn+5]; int n,T,ans; inline void init(){ jc[0]=1; for(int i=1;i<=maxn;i++) jc[i]=jc[i-1]*(ll)i%ha; ni[maxn]=ksm(jc[maxn],ha-2); for(int i=maxn;i;i--) ni[i-1]=ni[i]*(ll)i%ha; } inline int C(int x,int y){ return jc[x]*(ll)ni[y]%ha*(ll)ni[x-y]%ha;} int main(){ scanf("%d",&n); init(); for(int i=1;i<=n;i++) ADD(ans,C(i<<1,i)); printf("%d\n",ans); return 0; }
我爱学习,学习使我快乐