【TJOI/HEOI2016】求和
題面
題目分析
\[ \begin{split} \sum_{i=0}^n\sum_{j=0}^iS(i,j)\cdot 2^j\cdot j!&=\sum_{j=0}^n2^j\cdot j!\sum_{i=0}^nS(i,j)\\ &=\sum_{j=0}^n2^j\cdot j!\sum_{i=0}^n\sum_{k=0}^j\frac {(-1)^k}{k!}\cdot \frac{(j-k)^i}{(j-k)!}\\ &=\sum_{j=0}^n2^j\cdot j!\sum_{k=0}^j\frac {(-1)^k}{k!}\cdot \frac{\sum\limits_{i=0}^n(j-k)^i}{(j-k)!}\\ \end{split} \]
最終,\(\sum\limits_{i=0}^n(j-k)^i\)是等比數列求和,可以\(O(1)\)計算。
設\(g(i)=\frac{i^{n+1}-1}{(i-1)\cdot i!},g(0)=1,g(1)=n+1\),\(f(i)=\frac {(-1)^i}{i!}\)。
所以有
\[ ans=\sum_{j=0}^n2^j\cdot j!\sum_{k=0}^jf(k)\cdot g(j-k) \]
\(\sum_{k=0}^jf(k)\cdot g(j-k)\)是一個卷積,可以NTT計算。
代碼實現
#include<iostream> #include<cstring> #include<cmath> #include<algorithm> #include<cstdio> #include<iomanip> #include<cstdlib> #define MAXN 0x7fffffff typedef long long LL; const int N=400005,mod=998244353; using namespace std; inline int Getint(){register int x=0,f=1;register char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}return x*f;} int ksm(int x,int k){int ret=1;while(k){if(k&1)ret=(LL)ret*x%mod;x=(LL)x*x%mod,k>>=1;}return ret; } int rev[N]; void NTT(int *a,int x,int K){int n=(1<<x);for(int i=0;i<n;i++)if(i<rev[i])swap(a[i],a[rev[i]]);for(int i=1;i<n;i<<=1){int tmp=i<<1,wn=ksm(3,(mod-1)/tmp);if(K==-1)wn=ksm(wn,mod-2);for(int j=0;j<n;j+=tmp){int w=1;for(int k=0;k<i;k++,w=(LL)w*wn%mod){int x=a[j+k],y=(LL)w*a[i+j+k]%mod;a[j+k]=(x+y)%mod,a[i+j+k]=(x-y+mod)%mod;} }}if(K==-1){int inv=ksm(n,mod-2);for(int i=0;i<n;i++)a[i]=(LL)a[i]*inv%mod;} } int a[N],b[N],fac[N]; int main(){int n=Getint();fac[0]=1;for(int i=1;i<=n;i++)fac[i]=(LL)fac[i-1]*i%mod;a[0]=1,b[0]=1,b[1]=n+1;for(int i=1;i<=n;i++)a[i]=(((i&1)?-1:1)*ksm(fac[i],mod-2)+mod)%mod;for(int i=2;i<=n;i++)b[i]=(LL)(ksm(i,n+1)+mod-1)%mod*ksm((LL)(i-1)*fac[i]%mod,mod-2)%mod; int x=ceil(log2(n<<1|1));for(int i=0;i<(1<<x);i++)rev[i]=(rev[i>>1]>>1)|((i&1)<<x-1);NTT(a,x,1),NTT(b,x,1);for(int i=0;i<(1<<x);i++)a[i]=(LL)a[i]*b[i]%mod;NTT(a,x,-1);int ans=0;for(int i=0,t=1;i<=n;i++,t=((LL)t<<1)%mod)ans=(ans+(LL)fac[i]*t%mod*a[i]%mod)%mod;cout<<ans;return 0; }轉載于:https://www.cnblogs.com/Emiya-wjk/p/10021111.html
總結
以上是生活随笔為你收集整理的【TJOI/HEOI2016】求和的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Intellij IDEA Debug
- 下一篇: js学习(4) 函数