乘法并不容易用 FFT 或 NTT 维护,考虑在模意义下化乘为加。

化乘为加主要有两种方法:\(\log\) 和 \(\gamma\)(指标),由于在取模意义下,所以使用后者。

那剩下的部分就是快速幂,用 NTT 加速即可。时间复杂度 \(O(m\log m\log n)\)。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=50005,p=1004535809;
namespace NTT{
int rev[N],mx,k,m,qp,h;
struct dft{int fg[N];};
int qpow(int x,int y,int p){
int re=1;
while(y){
if(y&1) re=re*x%p;
x=x*x%p,y>>=1;
}return re;
}void init(int n){
mx=1,k=0,rev[0]=0,h=m-1;
while(mx<=n) mx*=2,k++;
for(int i=0;i<mx;i++)
rev[i]=(rev[i>>1]>>1)|((i&1)<<(k-1));
qp=qpow(mx,p-2,p);
}void fmd(dft &a){
for(int i=m-1;i<mx;i++) if(a.fg[i])
a.fg[i%h]=(a.fg[i%h]+a.fg[i])%p,a.fg[i]=0;
}void ntt(dft &a,int fl){
for(int i=0;i<mx;i++)
if(i<rev[i]) swap(a.fg[i],a.fg[rev[i]]);
for(int i=1;i<mx;i*=2){
int om=qpow(fl?3:(p+1)/3,(p-1)/(i<<1),p);
for(int j=0,w=1;j<mx;j+=i*2,w=1)
for(int k=j;k<j+i;k++,w=w*om%p){
int x=a.fg[k],y=w*a.fg[k+i]%p;
a.fg[k]=(x+y)%p,a.fg[k+i]=(x-y+p)%p;
}
}if(fl) return;
for(int i=0;i<mx;i++)
a.fg[i]=a.fg[i]*qp%p;
}
}using namespace NTT;
int n,ed,ln,g,ru[N];
dft re,now;vector<int>pr;
int prirt(int x){
x--;int cc=x;
for(int i=2;i*i<=x;i++){
if(cc%i==0) pr.push_back(i);
while(cc%i==0) cc/=i;
if(cc==1) continue;
}if(cc>1) pr.push_back(cc);
for(int i=1,fl=1;i<=x;i++,fl=1){
for(auto j:pr)
if(qpow(i,x/j,m)==1){fl=0;break;}
if(fl) return i;
}return 0;
}signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>m>>ed>>ln,init(m*2);
re.fg[0]=1,g=prirt(m);
for(int i=1,mi=1;i<m;i++)
ru[mi]=i-1,mi=mi*g%m;
for(int i=1,x;i<=ln;i++){
cin>>x;if(!x) continue;
now.fg[ru[x]]=1;
}while(n){
ntt(now,1);
if(n&1){
ntt(re,1);
for(int i=0;i<mx;i++)
re.fg[i]=re.fg[i]*now.fg[i]%p;
ntt(re,0),fmd(re);
}for(int i=0;i<mx;i++)
now.fg[i]=now.fg[i]*now.fg[i]%p;
ntt(now,0),fmd(now),n>>=1;
}cout<<re.fg[ru[ed]];
return 0;
}

[SDOI2015] 序列统计 题解的更多相关文章

  1. BZOJ3992:[SDOI2015]序列统计——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=3992 https://www.luogu.org/problemnew/show/P3321 小C ...

  2. 【题解】SDOI2015序列统计

    [题解]SDOI2015序列统计 来自永不AFO的YYB的推荐 这里是乘积,比较麻烦,不过由于给定的序列膜数是个小质数,所以可以\(O(m^2\log m)\)找原跟(实际上不需要这么多). 乘积有点 ...

  3. [BZOJ 3992][SDOI2015]序列统计

    3992: [SDOI2015]序列统计 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 2275  Solved: 1090[Submit][Stat ...

  4. 【LG3321】[SDOI2015]序列统计

    [LG3321][SDOI2015]序列统计 题面 洛谷 题解 前置芝士:原根 我们先看一下对于一个数\(p\),它的原根\(g\)有什么性质(好像就是定义): \(g^0\%p,g^1\%p,g^2 ...

  5. 【BZOJ3992】[SDOI2015]序列统计 NTT+多项式快速幂

    [BZOJ3992][SDOI2015]序列统计 Description 小C有一个集合S,里面的元素都是小于M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数列中的每个数都属 ...

  6. BZOJ 3992: [SDOI2015]序列统计 快速幂+NTT(离散对数下)

    3992: [SDOI2015]序列统计 Description 小C有一个集合S,里面的元素都是小于M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数列中的每个数都属于集合S ...

  7. BZOJ 3992: [SDOI2015]序列统计 [快速数论变换 生成函数 离散对数]

    3992: [SDOI2015]序列统计 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 1017  Solved: 466[Submit][Statu ...

  8. [SDOI2015]序列统计

    [SDOI2015]序列统计 标签: NTT 快速幂 Description 给你一个模m意义下的数集,需要用这个数集生成一个数列,使得这个数列在的乘积为x. 问方案数模\(1004535809\). ...

  9. 3992: [SDOI2015]序列统计

    3992: [SDOI2015]序列统计 链接 分析: 给定一个集和s,求多少个长度为n的序列,满足序列中每个数都属于s,并且所有数的乘积模m等于x. 设$f=\sum\limits_{i=0}^{n ...

  10. [BZOJ3992][SDOI2015]序列统计(DP+原根+NTT)

    3992: [SDOI2015]序列统计 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 1888  Solved: 898[Submit][Statu ...

随机推荐

  1. echarts 的使用

    <template> // option 通过id行绑定     <div id="myRangChart" style="width: 100%;he ...

  2. openwrt交换机配置命令-swconfig

    swconfig swconfig 是交换接口 (switch) 配置命令. 交换机是二层设备,是我们用来配置vlan的必备利器. 使用swconfig list可以列出当前可用的 SWITCH 设备 ...

  3. metasploit扫描mysql空密码

    靶机IP 192.168.255.100 攻击机IP 192.168.255.200 流程开始 查找mysql登录模块 msf5 > search mysql_login 加载这个模块 msf5 ...

  4. 【Mybatis】学习笔记02:实现简单的查

    Mybatis02:简单的查 如果你没先去学 增删改 ,然后直接看这篇记录,我想会有些困难.因为该文写的很粗劣,只是简单的截图.所以没基础的建议先去看 [Mybatis]学习笔记01:连接数据库,实现 ...

  5. 【MyBatis】学习笔记09:动态设置表名

    [Mybatis]学习笔记01:连接数据库,实现增删改 [Mybatis]学习笔记02:实现简单的查 [MyBatis]学习笔记03:配置文件进一步解读(非常重要) [MyBatis]学习笔记04:配 ...

  6. 【转载】 Locust 官方文档

    链接:https://www.jianshu.com/p/40102e9a24cb 安装 一般直接通过 pip 就可以安装: $ pip install locust 注意: Locust 1.x 版 ...

  7. javax.management.InstanceNotFoundException: org.springframework.boot:type=Admin,name=SpringApplicati

    把这两个勾选去掉

  8. vue辅助函数mapState和mapGetter前面三个点到底是什么意思:对象展开运算符

    import store from "./store" computed: { useName: function() { return store.state.userName ...

  9. Springboot+Vue进行Web开发时特别需要注意的小事项

    Springboot+Vue进行Web开发时特别需要注意的小事项: 1.在测试页面效果时,如果没有特别设置安全Http访问,在输入url请求测试网页时,只能使用http://......,而不能使用h ...

  10. 开源即时通讯IM框架 MobileIMSDK v6.4 发布

    一.更新内容简介 本次更新为次要版本更新,进行了若干优化(更新历史详见:码云 Release Notes.Github Release Notes).MobileIMSDK 可能是市面上唯一同时支持  ...