FFT
 #include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define maxn 1000005
using namespace std;
inline int read() {
int x=,f=;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-;
for(;isdigit(ch);ch=getchar()) x=x*+ch-'';
return x*f;
}
double pi=acos(-1.0);
struct complex {
double x,y;
complex (double xx=,double yy=) {x=xx;y=yy;}
complex operator +(const complex b) const {return complex(x+b.x,y+b.y);}
complex operator -(const complex b) const {return complex(x-b.x,y-b.y);}
complex operator *(const complex b) const {return complex(x*b.x-y*b.y,x*b.y+y*b.x);}
}a[maxn],b[maxn];
int n,m;
int limit=,l,pos[maxn];
void FFT(complex *A,int tp) {
for(int i=;i<limit;i++) if(i<pos[i]) swap(A[i],A[pos[i]]);
for(int mid=;mid<limit;mid<<=) {
complex wn(cos(pi/mid),tp*sin(pi/mid));
for(int R=mid<<,j=;j<limit;j+=R) {
complex w(,);
for(int k=;k<mid;k++,w=w*wn) {
complex x=A[j+k],y=w*A[j+mid+k];
A[j+k]=x+y;
A[j+mid+k]=x-y;
}
}
}
return ;
}
int main() {
n=read(),m=read();
for(int i=;i<=n;i++) a[i].x=read();
for(int i=;i<=m;i++) b[i].x=read();
while(limit<=n+m) limit<<=,l++;
for(int i=;i<limit;i++) pos[i]=(pos[i>>]>>)|((i&)<<(l-));
FFT(a,);
FFT(b,);
for(int i=;i<limit;i++) a[i]=a[i]*b[i];
FFT(a,-);
for(int i=;i<=n+m;i++) printf("%d ",(int)(a[i].x/limit+0.5));
}

FFT

 生成函数

小A有ai个价值为Ai的物品,小B有bi个价值为Ai的物品,求用两个组成价值为ci的方案数

生成函数可以解决上面的这个问题,构造两个多项式,第X的Ai次方项的系数表示价值为i的物品有多少个,对两个人分别构造,乘在一起的多项式就代表所有的方案数。

原根

定义P的原根为满足的整数g。

NTT

 #include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define maxn 4000001
#define mod 998244353
#define ll long long
using namespace std;
inline int read() {
int x=,f=;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-;
for(;isdigit(ch);ch=getchar()) x=x*+ch-'';
return x*f;
}
ll a[maxn],b[maxn],pos[maxn];
ll n,m,limit=,l,g=;
ll power(ll x,ll y) {
ll ans=;
while(y) {
if(y&) ans*=x,ans%=mod;
x*=x,x%=mod;y>>=;
}
return ans;
}
void NTT(ll *A,int tp) {
for(int i=;i<limit;i++) if(i<pos[i]) swap(A[i],A[pos[i]]);
for(int mid=;mid<limit;mid<<=) {
ll wn=power(g,(mod-)/(mid<<));
if(tp==-) wn=power(wn,mod-);
for(int j=;j<limit;j+=(mid<<)) {
ll w=;
for(int k=;k<mid;k++,w*=wn,w%=mod) {
ll x=A[j+k],y=w*A[j+mid+k];
A[j+k]=x+y;A[j+k]=(A[j+k]%mod+mod)%mod;
A[j+mid+k]=x-y;A[j+mid+k]=(A[j+mid+k]%mod+mod)%mod;
}
}
}
if(tp==-) {
ll ny=power(limit,mod-);
for(int i=;i<limit;i++) A[i]*=ny,A[i]=(A[i]%mod+mod)%mod;
}
}
int main() {
n=read(),m=read();
for(int i=;i<=n;i++) a[i]=read();
for(int i=;i<=m;i++) b[i]=read();
while(limit<=n+m) limit<<=,l++;
for(int i=;i<limit;i++) pos[i]=(pos[i>>]>>)|((i&)<<(l-));
NTT(a,);
NTT(b,);
for(int i=;i<limit;i++) a[i]=a[i]*b[i],a[i]=(a[i]%mod+mod)%mod;
NTT(a,-);
for(int i=;i<=n+m;i++) printf("%lld ",a[i]);
}

NTT

多项式求逆

 #include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define ll long long
#define mod 998244353
#define maxn 1000000
using namespace std;
inline int read() {
int x=,f=;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-;
for(;isdigit(ch);ch=getchar()) x=x*+ch-'';
return x*f;
}
ll g=,limit=,l,n;
ll a[maxn],b[maxn],pos[maxn],c[maxn];
ll power(ll x,ll y) {
ll ans=;
while(y) {
if(y&) ans*=x,ans%=mod;
x*=x,x%=mod;y>>=;
}
return ans;
}
void NTT(ll *A,int tp) {
for(int i=;i<limit;i++) if(i<pos[i]) swap(A[i],A[pos[i]]);
for(int mid=;mid<limit;mid<<=) {
ll wn=power(g,(mod-)/(mid<<));
if(tp==-) wn=power(wn,mod-);
for(int j=;j<limit;j+=(mid<<)) {
ll w=;
for(int k=;k<mid;k++,w*=wn,w%=mod) {
ll x=A[j+k],y=w*A[j+mid+k]%mod;
A[j+k]=x+y;A[j+k]=(A[j+k]%mod+mod)%mod;
A[j+mid+k]=x-y;A[j+mid+k]=(A[j+mid+k]%mod+mod)%mod;
}
}
}
if(tp==-) {
ll ny=power(limit,mod-);
for(int i=;i<limit;i++) A[i]*=ny,A[i]=(A[i]%mod+mod)%mod;
}
}
int d[maxn];
void inv(int step,ll *A,ll *B) {
if(step==) {B[]=power(A[],mod-);return;}
inv((step+)>>,A,B);
l=,limit=;
while(limit<=(step<<)) limit<<=,l++;
for(int i=;i<limit;i++) pos[i]=(pos[i>>]>>)|((i&)<<(l-));
for(int i=;i<step;i++) c[i]=A[i];
for(int i=step;i<limit;i++) c[i]=;
NTT(c,);NTT(B,);
for(int i=;i<limit;i++) B[i]=((2ll-c[i]*B[i]%mod)+mod)%mod*B[i]%mod;
NTT(B,-);
for(int i=step;i<limit;i++) B[i]=;
}
int main() {
n=read();
for(int i=;i<n;i++) a[i]=read();
inv(n,a,b);
for(int i=;i<n;i++) printf("%lld ",b[i]);
}

多项式求逆

多项式开根

 void getsqr(ll *A,ll *B,ll len) {
if(len==) {B[]=;return;}
getsqr(A,B,(len+)>>);
memset(invb,,sizeof(invb));
getinv(B,invb,len);
l=,limit=;
while(limit<=(len<<)) limit<<=,l++;
for(int i=;i<limit;i++) pos[i]=(pos[i>>]>>)|((i&)<<(l-));
for(int i=;i<len;i++) c[i]=A[i];
for(int i=len;i<limit;i++) c[i]=;
NTT(invb,);NTT(c,);NTT(B,);
for(int i=;i<limit;i++) {B[i]=((c[i]*invb[i]%mod)*inv2%mod+B[i]*inv2)%mod;}
NTT(B,-);
for(int i=len;i<limit;i++) B[i]=;
}

FFT模板 生成函数 原根 多项式求逆 多项式开根的更多相关文章

  1. 【BZOJ3456】轩辕朗的城市规划 无向连通图计数 CDQ分治 FFT 多项式求逆 多项式ln

    题解 分治FFT 设\(f_i\)为\(i\)个点组成的无向图个数,\(g_i\)为\(i\)个点组成的无向连通图个数 经过简单的推导(枚举\(1\)所在的连通块大小),有: \[ f_i=2^{\f ...

  2. bzoj 3456 城市规划——分治FFT / 多项式求逆 / 多项式求ln

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3456 分治FFT: 设 dp[ i ] 表示 i 个点时连通的方案数. 考虑算补集:连通的方 ...

  3. 2019.01.01 bzoj3625:小朋友和二叉树(生成函数+多项式求逆+多项式开方)

    传送门 codeforces传送门codeforces传送门codeforces传送门 生成函数好题. 卡场差评至今未过 题意简述:nnn个点的二叉树,每个点的权值KaTeX parse error: ...

  4. 【BZOJ3625】【codeforces438E】小朋友和二叉树 生成函数+多项式求逆+多项式开根

    首先,我们构造一个函数$G(x)$,若存在$k∈C$,则$[x^k]G(x)=1$. 不妨设$F(x)$为最终答案的生成函数,则$[x^n]F(x)$即为权值为$n$的神犇二叉树个数. 不难推导出,$ ...

  5. NTT+多项式求逆+多项式开方(BZOJ3625)

    定义多项式$h(x)$的每一项系数$h_i$,为i在c[1]~c[n]中的出现次数. 定义多项式$f(x)$的每一项系数$f_i$,为权值为i的方案数. 通过简单的分析我们可以发现:$f(x)=\fr ...

  6. 【learning】多项式相关(求逆、开根、除法、取模)

    (首先要%miskcoo,这位dalao写的博客(这里)实在是太强啦qwq大部分多项式相关的知识都是从这位dalao博客里面学的,下面这篇东西是自己对其博客学习后的一些总结和想法,大部分是按照其博客里 ...

  7. [Codeforces438E][bzoj3625] 小朋友和二叉树 [多项式求逆+多项式开根]

    题面 传送门 思路 首先,我们把这个输入的点的生成函数搞出来: $C=\sum_{i=0}^{lim}s_ix^i$ 其中$lim$为集合里面出现过的最大的数,$s_i$表示大小为$i$的数是否出现过 ...

  8. P6295-有标号 DAG 计数【多项式求逆,多项式ln】

    正题 题目链接:https://www.luogu.com.cn/problem/P6295 题目大意 求所有\(n\)个点的弱联通\(DAG\)数量. \(1\leq n\leq 10^5\) 解题 ...

  9. bzoj 3625小朋友和二叉树 多项式求逆+多项式开根 好题

    题目大意 给定n种权值 给定m \(F_i表示权值和为i的二叉树个数\) 求\(F_1,F_2...F_m\) 分析 安利博客 \(F_d=F_L*F_R*C_{mid},L+mid+R=d\) \( ...

随机推荐

  1. PowerDesigner12.5下载汉化及破解

    一.下载: 在网上直接输入PowerDesigner12.5下载,很多地方都可以下载成功. 二.汉化: 直接将解压的汉化文件复制[覆盖]到安装目录即可. 三.破解[稍微费事一点]: 1.安装完成后,修 ...

  2. tomcat 访问400 的一种情况

    tomcat 高版本对访问url做了较高的校验,如果url中包含特殊字符,tomcat会自动拦截,返回400错误.如果要包含特殊字符,需要事先进行转译. 我原来用的apache-tomcat-6.0. ...

  3. Mybatis中传入List条件

    传入一个map的参数,map里有一个tenantIds的List,在xml里先判断这个List的size是否大于o,然后通过foreach 构造一个in后面括号里的元素,具体的xml如下: <i ...

  4. html 5 新特性

    现在html 5技术是最新的html标准,掌握html 5已经变得非常重要,以下是我查看相关资料后对html 5 的新特性的总结,方便大家对比学习.html 5的新特性1.取消了一些过时的html 4 ...

  5. Android 之 Spinner 键值对的绑定(转)

    很多时候我们会在下拉菜单中绑定一个值,但是 Spinner本身不提供这样的服务 于是在网上找了N久,终于找到一个简单易用的方案;废话不多说,直接上菜了 首先要定义一个Item类,有以下要注意的:    ...

  6. 数学:Burnside引理与Pólya定理

    这个计数定理在考虑对称的计数中非常有用 先给出这个定理的描述,虽然看不太懂: 在一个置换群G={a1,a2,a3……ak}中,把每个置换都写成不相交循环的乘积. 设C1(ak)是在置换ak的作用下不动 ...

  7. Maven-Optional Dependencies & Dependency Exclusion

    本文讨论可选依赖和排除依赖.  帮助用户理解它们是什么, 如何使用, 它们如何工作, 以及什么时候使用它们最合适. 本文也将解释为什么排除是基于单个依赖的, 而非POM级别的. Optional De ...

  8. UIPageControl---iOS-Apple苹果官方文档翻译

    本系列所有开发文档翻译链接地址:iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址 //转载请注明出处--本文永久链接:http://www.cnblogs.com/Ch ...

  9. perl6中的q/qq/qx/qqx

    q不内插 qq内插 qx不内插 qqx内插

  10. 使用PTGui软件将全景图变成鱼眼图

    把全景图变成鱼眼图.方法一部分是自己研究的,一部分是参考学妹街景合成鱼眼照片的方法. 需要使用的软件是PTGui.是个收费软件,价格还不便宜.操作一下,安装完后就可以开始合成鱼眼图了. 加载图像 打开 ...