解题:洛谷4721 [模板]分治FFT

题面

这是CDQ入门题,不要被题目名骗了,这核心根本不在不在FFT上啊=。=

因为后面的项的计算依赖于前面的项,不能直接FFT。所以用CDQ的思想,算出前面然后考虑给后面的贡献

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int N=100005,mod=998244353;
 6 int a[4*N],b[4*N],rev[4*N],f[N],g[N],n,G,Gi;
 7 void exGCD(int a,int b,int &x,int &y)
 8 {
 9     if(!b) {x=1,y=0; return ;}
10     exGCD(b,a%b,y,x),y-=a/b*x;
11 }
12 int Qpow(int x,int k)
13 {
14     if(k==1) return x;
15     int tmp=Qpow(x,k/2);
16     return k%2?1ll*tmp*tmp%mod*x%mod:1ll*tmp*tmp%mod;
17 }
18 int Inv(int x,int m)
19 {
20     int xx,yy;
21     exGCD(x,m,xx,yy);
22     return (xx%m+m)%m;
23 }
24 void NTT(int *arr,int len,int typ)
25 {
26     for(int i=0;i<=len;i++)
27         if(rev[i]>i) swap(arr[rev[i]],arr[i]);
28     for(int i=2;i<=len;i<<=1)
29     {
30         int lth=i>>1,ort=Qpow(~typ?G:Gi,(mod-1)/i);
31         for(int j=0;j<len;j+=i)
32         {
33             int ori=1,tmp;
34             for(int k=j;k<j+lth;k++,ori=1ll*ori*ort%mod)
35             {
36                 tmp=1ll*ori*arr[k+lth]%mod;
37                 arr[k+lth]=(arr[k]-tmp+mod)%mod;
38                 arr[k]=(arr[k]+tmp)%mod;
39             }
40         }
41     }
42     if(typ==-1)
43         for(int i=0,ni=Inv(len,mod);i<len;i++) 
44             arr[i]=1ll*arr[i]*ni%mod;
45 }
46 void CDQ(int l,int r,int mid)
47 {
48     int len=r-l+1,m=1;
49     for(int i=l;i<=mid;i++) a[i-l]=f[i];
50     for(int i=0;i<len;i++) b[i]=g[i]; len+=mid-l+1;
51     while(m<=len) m<<=1;
52     for(int i=1;i<=m;i++) rev[i]=(rev[i>>1]>>1)+(i&1)*(m>>1);
53     NTT(a,m,1),NTT(b,m,1);
54     for(int i=0;i<=m;i++) a[i]=1ll*a[i]*b[i]%mod;
55     NTT(a,m,-1);
56     for(int i=mid+1;i<=r;i++) f[i]+=a[i-l],f[i]%=mod;
57     for(int i=0;i<=m;i++) a[i]=b[i]=0;
58 }
59 void Divide(int l,int r)
60 {
61     if(l==r) return;
62     int mid=(l+r)/2;
63     Divide(l,mid),CDQ(l,r,mid),Divide(mid+1,r);
64 }
65 int main()
66 {
67     scanf("%d",&n);
68     for(int i=1;i<n;i++) scanf("%d",&g[i]);
69     f[0]=1,G=3,Gi=Inv(G,mod),Divide(0,n-1);
70     for(int i=0;i<n;i++) printf("%d ",f[i]);
71     return 0;
72 }
View Code

 

转载于:https://www.cnblogs.com/ydnhaha/p/10222165.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 JavaScript 编写的记忆游戏(附源代码)   项目:JavaScript 记忆游戏(附源代码) 记忆检查游戏是一个使用 HTML5、CSS 和 JavaScript 开发的简单项目。这个游戏是关于测试你的短期 记忆技能。玩这个游戏 时,一系列图像会出现在一个盒子形状的区域中 。玩家必须找到两个相同的图像并单击它们以使它们消失。 如何运行游戏? 记忆游戏项目仅包含 HTML、CSS 和 JavaScript。谈到此游戏的功能,用户必须单击两个相同的图像才能使它们消失。 点击卡片或按下键盘键,通过 2 乘 2 旋转来重建鸟儿对,并发现隐藏在下面的图像! 如果翻开的牌面相同(一对),您就赢了,并且该对牌将从游戏中消失! 否则,卡片会自动翻面朝下,您需要重新尝试! 该游戏包含大量的 javascript 以确保游戏正常运行。 如何运行该项目? 要运行此游戏,您不需要任何类型的本地服务器,但需要浏览器。我们建议您使用现代浏览器,如 Google Chrome 和 Mozilla Firefox, 以获得更好、更优化的游戏体验。要玩游戏,首先,通过单击 memorygame-index.html 文件在浏览器中打开游戏。 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。
使用 JavaScript 编写的 Squareshooter 游戏及其源代码   项目:使用 JavaScript 编写的 Squareshooter 游戏(附源代码) 这款游戏是双人游戏。这是一款使用 JavaScript 编写的射击游戏,带有门户和强化道具。在这里,每个玩家都必须控制方形盒子(作为射手)。这款射击游戏的主要目标是射击对手玩家以求生存。当它射击对手时,它会获得一分。 游戏制作 该游戏仅使用 HTML 和 JavaScript 开发。该游戏的 PC 控制也很简单。 对于玩家 1: T:朝你上次动作的方向射击 A:向左移动 D:向右移动 W:向上移动 S:向下移动 对于玩家2: L:朝你上次移动的方向射击 左箭头:向左移动 右箭头:向右移动 向上箭头:向上移动 向下箭头:向下移动 游戏会一直进行,直到您成功射击对手或对手射击您为止。游戏得分显示在顶部。所有游戏功能均由 JavaScript 设置,而布局和其他次要功能则由 HTML 设置。 如何运行该项目? 要运行此项目,您不需要任何类型的本地服务器,但需要浏览器。我们建议您使用现代浏览器,如 Google Chrome 和 Mozilla Firefox。要运行此游戏,首先,通过单击 index.html 文件在浏览器中打开项目。 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值