[COGS2287][HZOI 2015]疯狂的机器人(NTT)
2017-04-04 10:30
316 查看
=== ===
这里放传送门=== ===
题解
首先把机器人的路径分成上下和左右两部分考虑。设上下一共走了i步,方案数为c[i]。那么因为最后要回到原点,所以i必须是偶数,并且向上和向下分别走了i2步。而又因为不能走出第一象限,所以任意时刻向上走的步数不能小于向下走的步数。
可以看出这实际上就是第i2项卡特兰数。
那么如果不考虑不走的情况,设一共走了i步的方案数为f[i],那么显然f[i]=∑j=0ic[j]∗c[i−j]∗Cji=c[j]∗c[i−j]∗i!j!(i−j)!
设g[i]=c[i]i!,那么f[i]=i!∑j=1ig[j]∗g[i−j]
显然可以用NTT进行加速。
最后统计答案的时候枚举有多少步不走,那么ans=∑i=0nCin∗f[n−i]
代码
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const long long Mod=998244353; int n,G,L,R[300010],N,M; long long Ct[300010],mul[300010],g[300010],f[300010],ans,tmp; long long powww(long long a,int t,long long Mod){ long long ans=1;a%=Mod; while (t!=0){ if (t&1) ans=(ans*a)%Mod; a=(a*a)%Mod;t>>=1; } return ans; } int calc(int x){ bool flag; if (x==2) return 1; for (int i=2;;i++){ flag=true; for (int j=2;j*j<x;j++) if (powww(i,(x-1)/j,x)==1){ flag=false;break; } if (flag==true) return i; } } long long C(int n,int m){ long long up,down; up=mul ;down=mul[m]*mul[n-m]%Mod; up=up*powww(down,Mod-2,Mod)%Mod; return up; } void NTT(long long *a,int N,int opt){ long long wn,w,x,y; for (int i=0;i<N;i++) if (i<R[i]) swap(a[i],a[R[i]]); for (int k=1;k<N;k<<=1){ wn=powww(G,(Mod-1)/(k<<1),Mod); for (int p=(k<<1),i=0;i<N;i+=p){ w=1; for (int j=0;j<k;j++){ x=a[i+j];y=w*a[i+j+k]%Mod; a[i+j]=(x+y)%Mod;a[i+j+k]=(x-y)%Mod; w=(w*wn)%Mod; } } } if (opt==-1) reverse(a+1,a+N); } int main() { scanf("%d",&n); G=calc(Mod);mul[0]=1;M=n+n; for (N=1;N<=M;N<<=1) L++; for (int i=0;i<N;i++) R[i]=(R[i>>1]>>1)|((i&1)<<(L-1)); for (int i=1;i<=N;i++) mul[i]=(mul[i-1]*i)%Mod; for (int i=2;i<=n;i+=2) Ct[i]=(C(i,i/2)-C(i,i/2-1))%Mod; for (int i=0;i<=n;i++) g[i]=Ct[i]*powww(mul[i],Mod-2,Mod)%Mod; g[0]=1;NTT(g,N,1); for (int i=0;i<=N;i++) f[i]=g[i]%Mod*g[i]%Mod; NTT(f,N,-1);tmp=powww(N,Mod-2,Mod); for (int i=0;i<=N;i++) f[i]=f[i]*tmp%Mod*mul[i]%Mod; for (int i=0;i<=n;i++) ans=(ans+f[i]*C(n,i)%Mod)%Mod; ans=(ans+Mod)%Mod; printf("%I64d\n",ans); return 0; }
偏偏在最后出现的补充说明
做FFT和NTT相关的题目的时候要有意识地尽量往卷积的方面考虑相关文章推荐
- COGS2287 [HZOI 2015]疯狂的机器人
- cogs 2287. [HZOI 2015]疯狂的机器人 (NTT优化DP)
- [COGS2287][HZOI 2015]疯狂的机器人(NTT+组合数学)
- [COGS 2287][HZOI 2015]疯狂的机器人
- 【COGS】2287:[HZOI 2015]疯狂的机器人 FFT+卡特兰数+排列组合
- [HZOI 2015]疯狂的机器人
- BZOJ 2287. [HZOI 2015]疯狂的机器人 [FFT 组合计数]
- NKOJ 4028(HZOI 2015)疯狂的机器人(NTT+卡特兰数)
- [任意模数NTT 三模数NTT] COGS 2294 [HZOI 2015] 释迦
- [COGS2189][HZOI 2015]帕秋莉的超级多项式-NTT-多项式求逆-多项式求ln-多项式开方-多项式求exp-多项式快速幂
- cogs 2123. [HZOI 2015] Glass Beads
- [HZOI 2015]复仇的序幕曲
- BZOJ 3992: [SDOI2015]序列统计 倍增dp 原根 NTT
- BZOJ[3992][SDOI2015]序列统计 生成函数+NTT
- 【BZOJ3992】[SDOI2015]序列统计 NTT+多项式快速幂
- [HZOI 2015]树黑白
- 「HZOI 2015」Math
- BZOJ 3992 [SDOI2015]序列统计 NTT
- [BZOJ3992][SDOI2015]序列统计(dp+NTT+快速幂)
- 2015-2016 ACM-ICPC, Central Europe Regional Contest (CERC 15) F.Frightful Formula(大数NTT)