HDU - 6589 Sequence (生成函数+NTT)
设序列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 ;
}
HDU - 6589 Sequence (生成函数+NTT)的更多相关文章
- HDU 3397 Sequence operation(线段树)
HDU 3397 Sequence operation 题目链接 题意:给定一个01序列,有5种操作 0 a b [a.b]区间置为0 1 a b [a,b]区间置为1 2 a b [a,b]区间0变 ...
- HDU 5919 Sequence II(主席树+逆序思想)
Sequence II Time Limit: 9000/4500 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) To ...
- hdu 5146 Sequence
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5146 Sequence Description Today we have a number sequ ...
- 2018.12.31 bzoj3992: [SDOI2015]序列统计(生成函数+ntt+快速幂)
传送门 生成函数简单题. 题意:给出一个集合A={a1,a2,...as}A=\{a_1,a_2,...a_s\}A={a1,a2,...as},所有数都在[0,m−1][0,m-1][0,m− ...
- HDU 6395 Sequence 【矩阵快速幂 && 暴力】
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6395 Sequence Time Limit: 4000/2000 MS (Java/Others) ...
- bzoj 3992: [SDOI2015]序列统计【原根+生成函数+NTT+快速幂】
还是没有理解透原根--题目提示其实挺明显的,M是质数,然后1<=x<=M-1 这种计数就容易想到生成函数,但是生成函数是加法,而这里是乘法,所以要想办法变成加法 首先因为0和任何数乘都是0 ...
- hdu 5312 Sequence(数学推导——三角形数)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5312 Sequence Time Limit: 2000/2000 MS (Java/Others) ...
- hdu 1711Number Sequence (KMP入门,子串第一次出现的位置)
Number Sequence Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- [P5748] 集合划分计数 - 生成函数,NTT
求 \(10^5\) 以内的所有贝尔数:将 \(n\) 个有标号的球划分为若干非空集合的方案数 Solution 非空集合的指数生成函数为 \(F(x)=e^x-1\) 枚举一共用多少个集合,答案就是 ...
随机推荐
- 关于DOM操作的案例
1. 模态框案例 需求: 打开网页时有一个普通的按钮,点击当前按钮显示一个背景图,中心并弹出一个弹出框,点击X的时候会关闭当前的模态框 代码如下: <!DOCTYPE html> < ...
- 安卓的一些UI美化框架的使用
目录 一.前言 二.Android-Bootstrap 三.Sweet Alert Dialog 四.ExplosionField 一.前言 在这里记录一些用到过的觉得还算不错的UI第三方开源美化框架 ...
- Adobe Acrobat XI 中文版激活方法
Adobe Acrobat XI不仅只是出色的PDF编辑.转换软件.此次更新深度整合了Microsoft Office套件,实现了PDF与Word.Excel以及PowerPoint等文档间的无缝相互 ...
- 【DSP开发】【图像处理】Gray与YUV之间的转换关系
标准的V4L2 API http://v4l.videotechnology.com/dwg/v4l2.pdf 在例程/home/dvevm_1_20/demos/ImageGray中,涉及到图像采集 ...
- Python全栈开发之3、深浅拷贝、变量和函数、递归、函数式编程、内置函数
一.深浅拷贝 1.数字和字符串 对于 数字 和 字符串 而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. import copy # 定义变量 数字.字符串 # n1 = 123 n1 ...
- PTA(Basic Level)1038.统计同成绩学生
本题要求读入 N 名学生的成绩,将获得某一给定分数的学生人数输出. 输入格式: 输入在第 1 行给出不超过 105 的正整数 N,即学生总人数.随后一行给出 N 名学生的百分制整数成绩,中间以空格分隔 ...
- CodeForces 820B + 821C
(点击题目即可查看原题) 820B Mister B and Angle in Polygon 题意:在一个正n边形中,每个顶点按顺序记为1~n,正n边形中任意三点顶点组成一个角,∠x1x2x3,问 ...
- 多表表与表关系 增删改查 admin
今日内容 多表表与表关系 增删改查表数据 admin 多表操作 表与表关系 默认指向主键 可能是隐藏主键 djamgo1.1默认级联(models. SET NULL解除级联) 一对一 先建立少的一方 ...
- 给网页中的button加动画效果
网页中的很多事件交互都是通过点击页面中的按钮来实现的,给按钮加一点动画效果也会让网页看起来生动一些,以下就是一个简单的例子: 此按钮的动画主要是通过css的transform动画,伪元素,伪类来实现: ...
- 数据绑定-@RequestParam
@PathVariable,前面已经讲过了 @RequestParam 作用:获取请求中的参数,GET请求,问号后面的请求参数,POST:请求体中的KV数据. 测试: