HDU - 6589 Sequence (生成函数+NTT)
2024-10-06 21:27:26
设序列a的生成函数$\large f(x)=\sum\limits_{i=0}^{n-1}a_ix^i$,则操作1,2,3分别对应将$f(x)$乘上$\Large\frac{1}{1-x},\frac{1}{1-x^2},\frac{1}{1-x^3}$,如果操作1,2,3分别进行了p1,p2,p3次,则最终序列的生成函数为$\Large\frac{f(x)}{(1-x)^{p_1}(1-x^2)^{p_2}(1-x^3)^{p_3}}$,套个二项式定理+多项式乘法+多项式逆元即可。由于题目中的模数刚好可以NTT,因此直接NTT即可。(ps:浮点数FFT取模常数太大,会TLE)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=4e5+,M=1e6+,mod=;
const int G=;
int n,m,n2,a[N],b[][N],cnt[],fac[M],inv[M],invf[M];
int Pow(int x,int p) {
int ret=;
for(; p; p>>=,x=(ll)x*x%mod)if(p&)ret=(ll)ret*x%mod;
return ret;
}
int C(int n,int m) {return n<m?:(ll)fac[n]*invf[m]%mod*invf[n-m]%mod;}
struct F_FT {
int A[N],B[N],b[N],c[N];
void FFT(int* a,int n,int f) {
for(int i=,j=n>>,k; i<n-; ++i,j^=k) {
if(i<j)swap(a[i],a[j]);
for(k=n>>; j&k; j^=k,k>>=);
}
for(int k=; k<n; k<<=) {
int gn=Pow(G,(mod-)/(k<<));
if(f==-)gn=Pow(gn,mod-);
for(int i=; i<n; i+=k<<) {
int g=;
for(int j=i; j<i+k; ++j,g=(ll)g*gn%mod) {
int x=a[j],y=(ll)g*a[j+k]%mod;
a[j]=((ll)x+y)%mod,a[j+k]=((ll)x-y+mod)%mod;
}
}
}
if(!~f)for(int i=; i<n; ++i)a[i]=(ll)a[i]*inv[n]%mod;
}
void mul(int* a,int* b,int* c,int n) {
for(int i=; i<n; ++i)A[i]=a[i],B[i]=b[i],A[i+n]=B[i+n]=;
n<<=;
FFT(A,n,),FFT(B,n,);
for(int i=; i<n; ++i)c[i]=(ll)A[i]*B[i]%mod;
FFT(c,n,-);
}
void inverse(int* a,int n) {
for(int i=; i<n; ++i)b[i]=;
b[]=Pow(a[],mod-);
for(int m=; m<=n; m<<=) {
mul(b,b,c,m),mul(a,c,c,m);
for(int i=; i<m; ++i)b[i]=(((ll)b[i]*-c[i])%mod+mod)%mod;
}
for(int i=; i<n; ++i)a[i]=b[i];
}
} fft;
int main() {
fac[]=invf[]=inv[]=;
for(int i=; i<M; ++i)inv[i]=(ll)(mod-mod/i)*inv[mod%i]%mod;
for(int i=; i<M; ++i)fac[i]=(ll)fac[i-]*i%mod,invf[i]=(ll)invf[i-]*inv[i]%mod;
int T;
for(scanf("%d",&T); T--;) {
memset(cnt,,sizeof cnt);
memset(a,,sizeof a);
scanf("%d%d",&n,&m);
n2=;
for(; n2<n; n2<<=);
for(int i=; i<n; ++i)scanf("%d",&a[i]);
while(m--) {
int x;
scanf("%d",&x);
cnt[x-]++;
}
for(int j=; j<; ++j) {
for(int i=; i<n2; ++i)b[j][i]=;
for(int i=; i*(j+)<n2; ++i)b[j][i*(j+)]=(ll)C(cnt[j],i)*(i&?mod-:)%mod;
if(j)fft.mul(b[],b[j],b[],n2);
}
fft.inverse(b[],n2),fft.mul(a,b[],a,n2);
ll ans=;
for(int i=; i<n; ++i)ans^=(ll)a[i]*(i+);
printf("%lld\n",ans);
}
return ;
}
也可以直接利用性质$\Large\frac{1}{(1-x)^n}=\sum\limits_{i=0}^{n}C_{n-1+i}^{i}x^i$,省去了求逆元的过程。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=4e5+,M=1e6+,mod=;
const int G=;
int n,m,n2,a[N],b[][N],c[N],cnt[],fac[M],inv[M],invf[M];
int Pow(int x,int p) {
int ret=;
for(; p; p>>=,x=(ll)x*x%mod)if(p&)ret=(ll)ret*x%mod;
return ret;
}
int C(int n,int m) {return n<m?:(ll)fac[n]*invf[m]%mod*invf[n-m]%mod;}
struct F_FT {
int A[N],B[N],c[N];
void FFT(int* a,int n,int f) {
for(int i=,j=n>>,k; i<n-; ++i,j^=k) {
if(i<j)swap(a[i],a[j]);
for(k=n>>; j&k; j^=k,k>>=);
}
for(int k=; k<n; k<<=) {
int gn=Pow(G,(mod-)/(k<<));
if(f==-)gn=Pow(gn,mod-);
for(int i=; i<n; i+=k<<) {
int g=;
for(int j=i; j<i+k; ++j,g=(ll)g*gn%mod) {
int x=a[j],y=(ll)g*a[j+k]%mod;
a[j]=((ll)x+y)%mod,a[j+k]=((ll)x-y+mod)%mod;
}
}
}
if(!~f)for(int i=; i<n; ++i)a[i]=(ll)a[i]*inv[n]%mod;
}
void mul(int* a,int* b,int* c,int n) {
for(int i=; i<n; ++i)A[i]=a[i],B[i]=b[i],A[i+n]=B[i+n]=;
n<<=;
FFT(A,n,),FFT(B,n,);
for(int i=; i<n; ++i)c[i]=(ll)A[i]*B[i]%mod;
FFT(c,n,-);
}
} fft;
int main() {
fac[]=invf[]=inv[]=;
for(int i=; i<M; ++i)inv[i]=(ll)(mod-mod/i)*inv[mod%i]%mod;
for(int i=; i<M; ++i)fac[i]=(ll)fac[i-]*i%mod,invf[i]=(ll)invf[i-]*inv[i]%mod;
int T;
for(scanf("%d",&T); T--;) {
memset(cnt,,sizeof cnt);
memset(a,,sizeof a);
scanf("%d%d",&n,&m);
n2=;
for(; n2<n; n2<<=);
for(int i=; i<n; ++i)scanf("%d",&a[i]);
while(m--) {
int x;
scanf("%d",&x);
cnt[x-]++;
}
for(int j=; j<; ++j) {
for(int i=; i<n2; ++i)b[j][i]=;
if(cnt[j]==)b[j][]=;
else for(int i=; i*(j+)<n2; ++i)b[j][i*(j+)]=C(cnt[j]-+i,i);
if(j)fft.mul(b[],b[j],b[],n2);
}
fft.mul(a,b[],a,n2);
ll ans=;
for(int i=; i<n; ++i)ans^=(ll)a[i]*(i+);
printf("%lld\n",ans);
}
return ;
}
最新文章
- 基于开源项目SharpMap的热力图(HeatLayer)实现。
- Linux yum如何下载rpm包到本地
- (原创)JAVA多线程二线程池
- ecshop Admin后台删除(Ajxa删除,无跳转连接)
- OC-ARC
- const和#define 区别
- mysql中OPTIMIZE TABLE的作用
- umask设置导致的weblogic中的应用上传的文件没有权限打开
- FZU 2016 summer train I. Approximating a Constant Range 单调队列
- JSF 2.0 hello world example
- [CF Round #294 div2] D. A and B and Interesting Substrings 【Map】
- sizeof用法研究
- Collection使用方法
- 一个简单的webserver
- 【译】ASP.NET MVC 5 教程 - 8:搜索查询
- ARC注意的泄漏问题
- BEncoding的编码与解码
- Oracle函数sys_connect_by_path 详解
- Django的ModelForm组件
- 逆向学习-Upack的PE文见头分析
热门文章
- 关于react native 路由传值及回调方法的理解
- TensorFlow自编码器(AutoEncoder)之MNIST实践
- NLP中的对抗样本
- mybatis学习 (五) POJO的映射文件
- hdfs基本文件操作
- AtCoder Beginner Contest 131 Task F. Must Be Rectangular
- ASP.NET Core WebApi使用Swagger生成API说明文档【xml注释版】
- python 变量 (全面不一样的变量)
- JAVA break、continue和return的区别
- python使用Flask作为MockServer的方法