乘法并不容易用 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. JAVA中ScheduledExecutorService的使用方法

    ScheduledExecutorService 简介 ScheduledExecutorService是 Java 中的一个接口,它是ExecutorService的子接口.它主要用于在给定的延迟之 ...

  2. 前端好用API之scrollIntoView

    前情 在前端开发需求中,经常需要用到锚点功能,以往都是获取元素在滚动容器中的位置再设置scrollTop来实现的. scrollIntoView介绍 scrollIntoView()方法将调用它的元素 ...

  3. HBuilderX代码缩进问题

    前情 uni-app是我很喜欢的跨平台框架,它能开发小程序,H5,APP(安卓/iOS),对前端开发很友好,自带的IDE让开发体验也很棒,公司项目就是主推uni-app,自然也是用官方自带的IDE了 ...

  4. SQL Server创建用户一直提示用户已存在的解决办法

    背景:复制的老数据库,创建账号onlyread时,一直提示数据库里有这个用户名.报错如下:"用户.组或角色'onlyread'在当前数据库中已存在." 解决方法: 1. 查询数据库 ...

  5. 授权|取消授权MYSQL数据库用户权限

    授权 queryusr用户查询test数据库 grant select on test.* to queryusr@'%'; flush PRIVILEGES 收回queryusr用户查询test数据 ...

  6. C++顺序结构(2)学习任务

    在坚果云中注册免费个人云盘 一.视频下载存放在规划好的文件夹中,并观看学习 1.变量存储.注释 2.四则运算.输入 3.认识设置DEV-C++ 4.第一个C++程序 5.头文件 6.命名空间 7.co ...

  7. 《Django 5 By Example》读后感

    一. 为什么选择这本书? 本人的工作方向为Python Web方向,想了解下今年该方向有哪些新书出版,遂上packt出版社网站上看了看,发现这本书出版时间比较新(2024年9月),那就它了. 从202 ...

  8. Hive数据库【操作】+ 【分区】+【分桶】+【查询】+【运算】+【函数】

    目录 键值对信息 数据库表操作 内部表操作 外部表操作 分区表的操作 分桶表操作 数据查询 关系运算 数学运算 逻辑运算 数值计算 日期函数 键值对信息 添加数据库的描述信息(添加键值对信息) cre ...

  9. bug记录:Vue.use 加载 TabPane ,浏览器卡死

    问题描述 Vue.use 加载 TabPane ,浏览器卡死 原因分析 参考资料:https://blog.csdn.net/ye987987/article/details/103780297 经过 ...

  10. 代码依赖包安全漏洞检测神器 —— Dependency Check

    目前各个企业对于应用的安全越来越重视,而解决应用漏洞的本质是从代码安全抓起.通常关于代码的安全问题有两类:代码本身的安全问题和代码依赖包存在的安全问题.对于代码本身的安全问题,我们可以通过静态代码分析 ...