题目传送门
停更已久的blog。。。
orz ckw大佬
我们考虑构造 f f f的递推式。我们设有数组 c c c,满足
f [ n ] = ∑ i = 1 k c [ i ] × f [ n − i ] f[n]=\sum_{i=1}^{k}c[i]\times f[n-i] f[n]=i=1∑k​c[i]×f[n−i]
我们令 c [ 0 ] = − 1 c[0]=-1 c[0]=−1,则
∑ i = 0 k c [ i ] × f [ n − i ] = 0 \sum_{i=0}^{k}c[i]\times f[n-i]=0 i=0∑k​c[i]×f[n−i]=0
带入一下
∑ i = 0 k c [ i ] × ∑ j = 1 k a [ j ] v [ j ] n − i = 0 \sum_{i=0}^{k}c[i]\times \sum_{j=1}^{k}a[j]v[j]^{n-i}=0 i=0∑k​c[i]×j=1∑k​a[j]v[j]n−i=0
我们考虑去构造一个 c c c,满足这条式子。
我们发现如果任意 j j j都满足 ∑ i = 0 k c [ i ] a [ j ] v [ j ] n − i = 0 \sum_{i=0}^{k}c[i]a[j]v[j]^{n-i}=0 i=0∑k​c[i]a[j]v[j]n−i=0则一定满足上面的式子。
再变一下
∑ i = 0 k c [ i ] v [ j ] n − i = 0 \sum_{i=0}^{k}c[i]v[j]^{n-i}=0 i=0∑k​c[i]v[j]n−i=0
不难发现仍然满足。
我们再设有多项式 F ( x ) = ∑ i = 0 k c [ k − i ] x i F(x)=\sum_{i=0}^{k}c[k-i]x^{i} F(x)=i=0∑k​c[k−i]xi
我们可以构造 F ( x ) = − ∏ i = 1 k ( x − v [ i ] ) F(x)=-\prod_{i=1}^{k}(x-v[i]) F(x)=−i=1∏k​(x−v[i])
不难发现,根据这个多项式得出的 c c c还是满足上面的式子的233。
于是就可以用分治FFT求出 F ( x ) F(x) F(x)的各项系数,也就求出了 c c c数组。
接下来递推一下就好了。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=270005,mod=1004535809;
int n,k,len,v[N],f[N],res[N],rev[N],x[N],y[N];
int add(int a,int b){a+=b;return a<mod?a:a-mod;
}
int cut(int a,int b){a-=b;return a>=0?a:a+mod;
}
int fastpow(int a,int x){int res=1;while(x){if(x&1){res=1LL*res*a%mod;}x>>=1;a=1LL*a*a%mod;}return res;
}
void ntt(int a[],int dft,int n){for(int i=0;i<n;i++){rev[i]=(rev[i>>1]>>1)|((i&1)*(n>>1));if(i<rev[i]){swap(a[i],a[rev[i]]);}}for(int i=1;i<n;i<<=1){int wn=fastpow(3,(mod-1)/i/2);if(dft==-1){wn=fastpow(wn,mod-2);}for(int j=0;j<n;j+=(i<<1)){int w=1,x,y;for(int k=j;k<j+i;k++,w=1LL*w*wn%mod){x=a[k];y=1LL*w*a[k+i]%mod;a[k]=add(x,y);a[k+i]=cut(x,y);}}}if(dft==-1){int inv=fastpow(n,mod-2);for(int i=0;i<n;i++){a[i]=1LL*a[i]*inv%mod;}}
}
void mul(int a[],int b[],int c[],int n,int m){int len;for(len=1;len<=n+m;len<<=1);for(int i=0;i<n;i++){x[i]=a[i];}for(int i=n;i<len;i++){x[i]=0;}for(int i=0;i<m;i++){y[i]=b[i];}for(int i=m;i<len;i++){y[i]=0;}ntt(x,1,len);ntt(y,1,len);for(int i=0;i<len;i++){x[i]=1LL*x[i]*y[i]%mod;}ntt(x,-1,len);for(int i=0;i<n+m-1;i++){c[i]=x[i];}
}
void solve(int l,int r,int res[],int &len){if(l==r){res[0]=v[l]?mod-v[l]:0;res[1]=1;len=2;return;}int mid=(l+r)/2;int *lres=new int [(mid-l+1)<<1],*rres=new int [(r-mid)<<1],*llen=new int,*rlen=new int;solve(l,mid,lres,*llen);solve(mid+1,r,rres,*rlen);mul(lres,rres,res,*llen,*rlen);len=*llen+*rlen-1;delete [] lres;delete [] rres;delete llen;delete rlen;
}
int main(){scanf("%d%d",&n,&k);for(int i=1;i<=k;i++){scanf("%d",&v[i]);}for(int i=1;i<=k;i++){scanf("%d",&f[i]);}solve(1,k,res,len);for(int i=0;i<=k;i++){res[i]=res[i]?mod-res[i]:0;}reverse(res,res+k+1);for(int i=k+1;i<=n;i++){for(int j=1;j<=k;j++){f[i]=add(f[i],1LL*res[j]*f[i-j]%mod);}}printf("%d\n",f[n]);return 0;
}

【nowcoder Wannafly挑战赛24 F】 wyf的超级多项式【FFT/NTT】【构造】相关推荐

  1. Wannafly挑战赛24

    Wannafly挑战赛24 题目连接 https://www.nowcoder.com/acm/contest/186#question A.石子游戏 题解 注意到当石子个数为偶数的时候,每回合都会减 ...

  2. [牛客网Wannafly挑战赛24F]wyf的超级多项式

    Description 已知 F i = ∑ j = 1 k a j v j i F_i=\sum_{j=1}^{k}a_jv_j^i Fi​=∑j=1k​aj​vji​ 给出 v 1.. k v1. ...

  3. Wannafly挑战赛24 D 无限手套

    文章目录 ResultResultResult HyperlinkHyperlinkHyperlink DescriptionDescriptionDescription SolutionSoluti ...

  4. Wannafly挑战赛24 无限手套(生成函数)

    无限手套 每种宝石的生成函数为∑n≥0xn(ain2+bin+1)对其进行化简∑n≥0xn+∑n≥0binxn+∑n≥0ain2xn11−x+bix(1−x)2+aix(1+x)(1−x)3最后答案∏ ...

  5. Wannafly挑战赛14 F

    Shero在秘密基地有一个专门研究活骸化的实验室. 实验室里面有一排从0开始标号的培养皿,初始的时候只有0号培养皿中有1个细胞. 因为是虚拟实验,所以可以认为培养皿有无限个. Shero观察发现,来自 ...

  6. Wannafly挑战赛26 题解

    Wannafly挑战赛26 题目连接 https://www.nowcoder.com/acm/contest/212#question A. 御坂网络 枚举圆心所在的位置, O ( n ) O(n) ...

  7. [Wannafly挑战赛2D-Delete]最短路

    [Wannafly挑战赛2D-Delete]最短路 题目描述 给定一张 n 个点,m 条边的带权有向无环图,同时给定起点 S 和终点 T ,一共有 q 个询问,每次询问删掉某个点和所有与它相连的边之后 ...

  8. Wannafly挑战赛19

    Wannafly挑战赛19 A. 队列Q 需要支持把一个元素移到队首,把一个元素移到队尾,移到队首就直接放到队首前面那个位置,原位置标为0,队尾同理. #include <bits/stdc++ ...

  9. Wannafly挑战赛18

    Wannafly挑战赛18 A. 序列 先考虑暴力,相邻两个树之间乘上给定的三种数,递推出下一个位置填什么,然后再check一下,最后一位是否为1即可.这样时间显然不行,但是给我们一种思路,就是中间的 ...

最新文章

  1. 创建自己的人脸识别系统
  2. yolov3-tf2 数据格式压缩
  3. boost::gregorian模块实现月末日的测试程序
  4. python find函数_Python 速学!不懂怎么入门python的小白看这篇就够了!
  5. 虚拟搭建局域网模拟器_巧用虚拟局域网,快速搭建私有云,一步就能搞定
  6. 锐界机器人_2019款锐界智能家居远程控制使用介绍
  7. python 列表转字典的一些方法
  8. 如何打造7*24h持续交付通道?阿里高级技术专家的5点思考
  9. 买到春节回家的票了吗?用Python刷票,还不快来试试!(建议收藏) 为回家做准备...
  10. html js开发课程表,利用JS实现手机移动端课程表代码
  11. 第三方支付至支付宝对接
  12. 知乎文章导出完整PDF(简单易上手)
  13. GSM/GPRS之一-GSM基础知识
  14. php短网址生成原理,php 生成短网址原理及代码
  15. 称霸全球游戏,腾讯帝国的困局之处
  16. 相似视频搜索—Opera 的 Milvus 实践
  17. 【渗透测试】文件上传漏洞:upload-labs通关简记
  18. 智慧档案馆一体化监控系统设计所需要的10条依据
  19. 博客马拉松|和 OpenMLDB 一路向前
  20. typora 低版本免费 .md 下载地址

热门文章

  1. ai在计算机教学中的应用,浅谈人工智能在教育中的应用
  2. C# 使用Xunit 框架进行代码测试
  3. 定积分的概念与性质——“高等数学”
  4. [转载] Linux架构
  5. 新概念三英语学习Unit1
  6. 图书管理系统-书籍归还
  7. ansible UI管理工具awx安装实践
  8. OpenCV中的图像处理 —— 霍夫线 / 圈变换 + 图像分割(分水岭算法) + 交互式前景提取(GrabCut算法)
  9. 网站运营方案SEO【运营】
  10. CalBioreagents 艾美捷奇昆古尼亚病毒包膜蛋白单克隆抗体