【BZOJ3992】【SDOI2015】序列统计 EGF+多项式快速幂+循环卷积
如果是求$n$个数之和在模$m$意义下为$x$,那么做法是显然的。
但是这道题问的是$n$个数之积在模m意义下为$x$,那么做法就和上面的问题不同。
考虑如何把乘法转换成加法(求log):
题目中有一个很特殊的条件:$m$是个质数。
不妨假设$m$的原根为$g$。那么显然,我们可以用$g^x%m$构造出$[0,m)$中的所有数。
那么对于两个数$A$和$B$,我们将它变形为$g^{x_1}$和$g^{x_2}$,那么$A \times B=g^{x_1+x_2}$。
我们构造一个m-1次多项式A,对于A的第i项,A_i=$\begin{equation} \left\{ \begin{array}{lr} 1 \ [x^i \equiv k(mod\ m),\ k∈S].\\0 \end{array} \right. \end{equation}$。
然后,不妨设读入的$X=g^k$,则答案即为$[x^k]A^n(x)$,注意这里的卷积是循环卷积。
然后就没了,注意S中出现0的情况。
#include<bits/stdc++.h>
#define M 32768
#define MOD 1004535809
#define G 3
#define L long long
using namespace std; L pow_mod(L x,L k){
L ans=;
while(k){
if(k&) ans=ans*x%MOD;
x=x*x%MOD; k>>=;
}
return ans;
} void change(L a[],int n){
for(int i=,j=;i<n-;i++){
if(i<j) swap(a[i],a[j]);
int k=n>>;
while(j>=k) j-=k,k>>=;
j+=k;
}
}
void NTT(L a[],int n,int on){
change(a,n);
for(int h=;h<=n;h<<=){
L wn=pow_mod(G,(MOD-)/h);
for(int j=;j<n;j+=h){
L w=;
for(int k=j;k<j+(h>>);k++){
L u=a[k],t=a[k+(h>>)]*w%MOD;
a[k]=(u+t)%MOD;
a[k+(h>>)]=(u-t+MOD)%MOD;
w=w*wn%MOD;
}
}
}
if(on==-){
L inv=pow_mod(n,MOD-);
for(int i=;i<n;i++) a[i]=a[i]*inv%MOD;
reverse(a+,a+n);
}
}
L a[M]={},b[M]={},ans[M]={};
int gn[M]={},g=,vis[M]={}; void get(int n){
for(int i=;i<n;i++){
memset(vis,,n<<);
vis[]=; gn[]=;
int hh=,ok=;
for(int j=;j<n-;j++){
hh=hh*i%n;
if(vis[hh]){ok=; break;}
vis[hh]=; gn[hh]=j;
}
if(ok){g=i; return;}
}
} int main(){
int n,m,x,s,nn=;
scanf("%d%d%d%d",&n,&m,&x,&s);
while(nn<(m*)) nn<<=;
get(m);
for(int i=;i<s;i++){
int x; scanf("%d",&x);
if(x==) continue;
x=gn[x];
a[x]++;
}
ans[]=; m--;
while(n){
if(n&){
NTT(a,nn,); NTT(ans,nn,);
for(int i=;i<nn;i++) ans[i]=ans[i]*a[i]%MOD;
NTT(a,nn,-); NTT(ans,nn,-);
for(int i=;i<m;i++) ans[i]=(ans[i]+ans[i+m])%MOD;
for(int i=m;i<nn;i++) ans[i]=;
}
NTT(a,nn,);
for(int i=;i<nn;i++) a[i]=a[i]*a[i]%MOD;
NTT(a,nn,-);
for(int i=;i<m;i++) a[i]=(a[i]+a[m+i])%MOD;
for(int i=m;i<nn;i++) a[i]=;
n>>=;
}
printf("%lld\n",ans[gn[x]]);
}
【BZOJ3992】【SDOI2015】序列统计 EGF+多项式快速幂+循环卷积的更多相关文章
- 【BZOJ3992】[SDOI2015]序列统计 NTT+多项式快速幂
[BZOJ3992][SDOI2015]序列统计 Description 小C有一个集合S,里面的元素都是小于M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数列中的每个数都属 ...
- LOJ 2183 / SDOI2015 序列统计 (DP+矩阵快速幂)
题面 传送门 分析 考虑容斥原理,用总的方案数-不含质数的方案数 设\(dp1[i][j]\)表示前i个数,和取模p为j的方案数, \(dp2[i][j]\)表示前i个数,和取模p为j的方案数,且所有 ...
- [BZOJ3992][SDOI2015]序列统计(DP+原根+NTT)
3992: [SDOI2015]序列统计 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 1888 Solved: 898[Submit][Statu ...
- BZOJ3992: [SDOI2015]序列统计
Description 小C有一个集合S,里面的元素都是小于M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数列中的每个数都属于集合S. 小C用这个生成器生成了许多这样的数列. ...
- 【NTT】bzoj3992: [SDOI2015]序列统计
板子题都差点不会了 Description 小C有一个集合S,里面的元素都是小于M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数 列,数列中的每个数都属于集合S.小C用这个生成器生 ...
- 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− ...
- BZOJ3992: [SDOI2015]序列统计(NTT 原根 生成函数)
题意 题目链接 给出大小为\(S\)的集合,从中选出\(N\)个数,满足他们的乘积\(\% M = X\)的方案数 Sol 神仙题Orz 首先不难列出最裸的dp方程,设\(f[i][j]\)表示选了\ ...
- BZOJ3992 [SDOI2015]序列统计 【生成函数 + 多项式快速幂】
题目 小C有一个集合S,里面的元素都是小于M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数 列,数列中的每个数都属于集合S.小C用这个生成器生成了许多这样的数列.但是小C有一个问题 ...
- 【动态规划】bzoj3992 [Sdoi2015]序列统计 10分
#include<cstdio> using namespace std; #define MOD 1004535809 int a[8001],f[1001][101],n,m,x,S; ...
随机推荐
- QQ使用技巧
1.改变真实地理位置 大家知道,现在很多QQ都是显示IP和地理位置的版本,这样一来,自己的位置就暴露了.其实想隐藏自己的位置也简单,只要用代理服务器就是了.不要把它看成很复杂的东西,建议去下载&quo ...
- KbmMW 4.5 发布
We are happy to announce the release of kbmMW v. 4.50.00 Professional, Enterprise and CodeGear Editi ...
- 二进制搭建kubernetes多master集群【二、配置flannel网络】
上一篇我们已经搭建etcd高可用集群,参考:二进制搭建kubernetes多master集群[一.使用TLS证书搭建etcd集群] 此文将搭建flannel网络,目的使跨主机的docker能够互相通信 ...
- mysql数据库中如何查询日期在两个时间之间的关系
select * from banner where addDate between '2017-06-04' and '2017-06-06';
- 第八章 连词(Les conjonction )
★并列连词(La conjonction de coordination ) ()表示联合关系的并列连词 .et连接肯定的内容.如: ➞Il conduit vite et bien. ...
- 【转】MapReduce:详解Shuffle过程
——转自:{http://langyu.iteye.com/blog/992916} Shuffle过程是MapReduce的核心,也被称为奇迹发生的地方.要想理解MapReduce, Shuffle ...
- C语言学生管理系统源码分享
大家好 我就是如假包换的...陈玲 自从运营了C语言程序设计微信公众号 很多粉丝都给我备注 ...奇葩 实在是不敢当 也被人开始叫玲玲姐 我知道 很多人都想看我出境 我本人也有 年多的舞台演讲训练 实 ...
- BZOJ 1011 [HNOI2008]遥远的行星 (误差分析)
1011: [HNOI2008]遥远的行星 Time Limit: 10 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 4974 Solved ...
- js函数预编译
function fn(a){ console.log(a); var a = 123; function a(){} console.log(a); var b = function(){} con ...
- mysql insert 事务相关(草稿)
当 insert 多条语句时初步试了一下是自带事务机制的,如在一个这样的表中: 执行语句 INSERT INTO `t_mytest`(`id`) VALUES (1),(2),(3),(4),(5) ...