BZOJ4555 求和 发表于 2017-03-27 | 更新于 2018-06-18 Link推导先放一放吧。。 这道题给我的教育很深刻: 一定要分清循环的是下标还是长度。FFT的lenlenlen写成了<n< n<n,查了很长时间 谨防填错模板函数参数的数据类型。 Code123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123#include "lucida"using std::swap;using std::reverse;const int MAXN=100000+11,P=998244353,MAXL=MAXN<<2,orig=3;template <class T>T pow(T base,int index) { T res; for(res=1;index;base*=base,index>>=1) { if(index&1) { res*=base; } } return res;}namespace modint { template <int modu> struct ModInt { int64 num; ModInt() {} ModInt(int64 num):num(num%P) {} ModInt inverse() const { return pow(*this,modu-2);//modu-1?.. } friend ModInt operator +(const ModInt &a,const ModInt &b) { return ModInt(a.num+b.num); } friend ModInt operator -(const ModInt &a,const ModInt &b) { return ModInt(a.num-b.num); } friend ModInt operator *(const ModInt &a,const ModInt &b) { return ModInt(a.num*b.num); } friend ModInt operator /(const ModInt &a,const ModInt &b) { return a*b.inverse(); } };}typedef modint::ModInt<P> ModInt;ModInt fac[MAXN];struct _{_(){ fac[0]=1; for(int i=1;i<MAXN;++i) { fac[i]=fac[i-1]*i; }}}Auto;void Trans(ModInt a[],int n,int d) { for(int i=1,j=n>>1;i<n-1;++i) { if(i<j) swap(a[i],a[j]); int k=n>>1; while(k<=j) { j-=k; k>>=1; } j+=k; } for(int len=2;len<=n;len<<=1) {//<=n?<n?. ModInt rt=pow((ModInt)orig,(P-1)/len);//实例化了int. //cos(2*pi*d/len),sin(2*pi*d/len) for(int i=0;i<n;i+=len) { ModInt w=1; for(int j=i;j<i+(len>>1);++j) { ModInt u=a[j],t=w*a[j+(len>>1)]; a[j]=u+t,a[j+(len>>1)]=u-t; w*=rt; } } } if(d==-1) { reverse(a+1,a+n); ModInt inv=ModInt(n).inverse(); for(int i=0;i<n;++i) { a[i]*=inv; } }}struct Polynomial { int64 a[MAXL],n; int64 &operator [](const int &x) { return a[x]; } const int64 &operator [](const int &x) const { return a[x]; } friend Polynomial operator *(const Polynomial &A,const Polynomial &B) { static Polynomial C; static ModInt a[MAXL],b[MAXL],c[MAXL]; int n=1;for(int lim=C.n=A.n+B.n-1;n<lim;n<<=1); for(int i=0;i<n;++i) { a[i]=i<A.n?A[i]:0; b[i]=i<B.n?B[i]:0; } Trans(a,n,1);Trans(b,n,1); for(int i=0;i<n;++i) { c[i]=a[i]*b[i]; } Trans(c,n,-1); for(int i=0;i<C.n;++i) { C[i]=c[i].num; } return C; }}A,B,C;int main() { freopen("input","r",stdin); int n;is>>n; A.n=B.n=n+1; for(int i=0;i<=n;++i) { A[i]=((i&1?-1:1)/fac[i]).num; } B[0]=1; B[1]=n+1; for(int i=2;i<=n;++i) { B[i]=((1-pow((ModInt)i,n+1))/((1-i)*fac[i])).num; } C=A*B; ModInt res=0; for(int i=0;i<=n;++i) { res+=pow(ModInt(2),i)*fac[i]*C[i]; } int64 Ans=(res.num+P)%P; os<<Ans<<'\n'; return 0;}