您的位置:首页 > 其它

[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相关的题目的时候要有意识地尽量往卷积的方面考虑
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  COGS HZOI NTT