【BZOJ3992】【SDOI2015】序列统计 原根 NTT
题目大意
有一个集合\(s\),里面的每个数都\(\geq0\)且\(<m\)。
问有多少个长度为\(n\)的数列满足这个数列所有数的乘积模\(m\)为\(x\)。答案模\(1004535809\)。
\(n\leq {10}^9,m\leq 8000\)且\(m\)是质数。
题解
先求出\(m\)的原根\(g\),这样\(1\)~\(m-1\)中的每个数都能被表示成\(g\)的幂。
因为\(g^ig^j=g^{i+j}\),这样就可以把乘积转成和,问题转化为问有多少个长度为\(n\)的数列满足这个数列所有数的和模\(m-1\)为\(y\),\(f_{i+1,j}=\sum f_{i,k}f_{i,j-k}\)。因为模数是NTT模数,原根为\(3\),所以可以用NTT优化。
ln&exp好像也可以做。
时间复杂度:\(O(m\log m\log n)\)
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#include<utility>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
int m;
ll p=1004535809;
int g;
int len=16384;
ll a[100010];
ll b[100010];
ll w1[100010];
ll w2[100010];
int rev[100010];
int c[10010];
ll fp(ll a,ll b)
{
ll s=1;
while(b)
{
if(b&1)
s=s*a%p;
a=a*a%p;
b>>=1;
}
return s;
}
int check(int x)
{
int s=1;
int i;
for(i=1;i<=m-2;i++)
{
s=s*x%m;
if(s==1)
return 0;
}
return 1;
}
void ntt(ll *a,int t)
{
int i,j,k;
ll u,v,w,wn;
for(i=0;i<len;i++)
if(rev[i]<i)
swap(a[i],a[rev[i]]);
for(i=2;i<=len;i<<=1)
{
wn=(t==1?w1[i]:w2[i]);
for(j=0;j<len;j+=i)
{
w=1;
for(k=j;k<j+i/2;k++)
{
u=a[k];
v=a[k+i/2]*w%p;
a[k]=(u+v)%p;
a[k+i/2]=(u-v+p)%p;
w=w*wn%p;
}
}
}
if(t==-1)
{
ll inv=fp(len,p-2);
for(i=0;i<len;i++)
a[i]=a[i]*inv%p;
}
}
void fp(int n)
{
int i;
while(n)
{
ntt(a,1);
if(n&1)
{
ntt(b,1);
for(i=0;i<len;i++)
b[i]=b[i]*a[i]%p;
ntt(b,-1);
for(i=m;i<len;i++)
{
b[i%m]=(b[i%m]+b[i])%p;
b[i]=0;
}
}
for(i=0;i<len;i++)
a[i]=a[i]*a[i]%p;
ntt(a,-1);
for(i=m;i<len;i++)
{
a[i%m]=(a[i%m]+a[i])%p;
a[i]=0;
}
n>>=1;
}
}
int main()
{
int n,x,u;
scanf("%d%d%d%d",&n,&m,&x,&u);
int i;
for(i=1;i<m;i++)
if(check(i))
g=i;
rev[0]=0;
for(i=1;i<len;i++)
rev[i]=(rev[i/2]>>1)|(i&1?len>>1:0);
for(i=2;i<=len;i<<=1)
{
w1[i]=fp(3,(p-1)/i);
w2[i]=fp(w1[i],p-2);
}
int s=1;
for(i=0;i<=m-2;i++)
{
c[s]=i;
s=s*g%m;
}
int v;
memset(a,0,sizeof a);
memset(b,0,sizeof b);
b[0]=1;
for(i=1;i<=u;i++)
{
scanf("%d",&v);
if(!v)
continue;
a[c[v]]++;
}
m--;
fp(n);
printf("%lld\n",b[c[x]]);
return 0;
}
【BZOJ3992】【SDOI2015】序列统计 原根 NTT的更多相关文章
- 【bzoj3992】[SDOI2015]序列统计 原根+NTT
题目描述 求长度为 $n$ 的序列,每个数都是 $|S|$ 中的某一个,所有数的乘积模 $m$ 等于 $x$ 的序列数目模1004535809的值. 输入 一行,四个整数,N.M.x.|S|,其中|S ...
- [BZOJ3992][SDOI2015]序列统计(DP+原根+NTT)
3992: [SDOI2015]序列统计 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 1888 Solved: 898[Submit][Statu ...
- BZOJ3992: [SDOI2015]序列统计(NTT 原根 生成函数)
题意 题目链接 给出大小为\(S\)的集合,从中选出\(N\)个数,满足他们的乘积\(\% M = X\)的方案数 Sol 神仙题Orz 首先不难列出最裸的dp方程,设\(f[i][j]\)表示选了\ ...
- BZOJ.3992.[SDOI2015]序列统计(DP NTT 原根)
题目链接 \(Description\) 给定\(n,m,x\)和集合\(S\).求\(\prod_{i=1}^na_i\equiv x\ (mod\ m)\)的方案数.其中\(a_i\in S\). ...
- 【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]序列统计
Description 小C有一个集合S,里面的元素都是小于M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数列中的每个数都属于集合S. 小C用这个生成器生成了许多这样的数列. ...
- BZOJ3992 [SDOI2015]序列统计 【生成函数 + 多项式快速幂】
题目 小C有一个集合S,里面的元素都是小于M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数 列,数列中的每个数都属于集合S.小C用这个生成器生成了许多这样的数列.但是小C有一个问题 ...
- 洛谷P3321 [SDOI2015]序列统计(NTT)
传送门 题意:$a_i\in S$,求$\prod_{i=1}^na_i\equiv x\pmod{m}$的方案数 这题目太珂怕了……数学渣渣有点害怕……kelin大佬TQL 设$f[i][j]$表示 ...
随机推荐
- Beta阶段团队成员贡献分分配规则
Beta阶段团队成员贡献分分配规则 Alpha阶段贡献分分配有些负责,在这里进行一些修改: 对任务完成得分部分进行了简化 对发现bug的惩罚措施进行了修改 移除了优化得分,不鼓励修改他人代码 移除了帮 ...
- Redis Sentinel 集群搭建常见注意事项
我的配置: 1个master,1个slave,3个sentinel 搭建的过程网上已经有很多了,这里列几个重点关注: 修改sentinel.conf的protected-mode与redis.conf ...
- 使用junit测试
package creeper; import java.util.Scanner; public class size { private static int intercePosition = ...
- linux系统下MySQL表名区分大小写问题
linux系统下MySQL表名区分大小写问题 https://www.cnblogs.com/jun1019/p/7073227.html [mysqld] lower_case_table_name ...
- Memcache之安装篇
本篇文章会介绍memcache在Windows和Linux下的具体安装过程,详细的记录其中的流程内容,帮助小伙伴们快速的搭建起memcache服务,废话少说,直接上!!! Windows: Memca ...
- ipython安装( jupyter)
生产环境:win10 64位 pip的版本不是最新的,输入命令 python -m pip install --upgrade pip 更新我们的pip,pip不是最新的也会导致安装不了ipython ...
- 通过爬虫程序深入浅出java 主从工作模型
随手做的爬虫程序在 https://github.com/rli07/master_java/blob/master/spider.zip 可下载. 这是我做的系统学习图, 可以参考一下 系统架 ...
- sass变量引入全局
https://www.jianshu.com/p/ab9ab999344b(copy) 本文以Sass做案例,Less的参考,基本配置大同小异. 假如我们有一个Sass的全局变量common.scs ...
- VMWARE中NAT下获取不到IP
1.编辑-虚拟网络编辑器-dhcp设置 2.虚拟机-可移动设备-网络适配器-设置,注意:这里一定要选nat,当初我就是选了桥接,死活上不去,搞了2个小时.
- word的"bug"
发表博客发现,从word复制文本到chrome浏览器上的博客时, 如果复制完后立即关闭word,那么将无法粘贴到通过chrome浏览器访问的博客上,也无法粘贴到记事本上: 但是复制完立即关闭word后 ...