bzoj 3992: [SDOI2015]序列统计 NTT+原根
今天开始学习丧心病狂的多项式qaq...... .
code:
#include <bits/stdc++.h>
#define ll long long
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
int qpow(int x,int y,int mod)
{
int res=1;
while(y)
{
if(y&1) res=1ll*res*x%mod;
x=1ll*x*x%mod;
y>>=1;
}
return res;
}
const int Mod=1004535809,G=3,iG=qpow(G,Mod-2,Mod),MAX_M=300000;
int fact[10000];
int GetRoot(int x)
{
int tot=0;
int phi=x-1;
for(int i=2;i*i<=phi;++i) if(phi%i==0) { fact[++tot]=i; while(phi%i==0) phi/=i; }
if(phi>1) fact[++tot]=phi;
phi=x-1;
for(int i=2;i<=phi;++i)
{
bool flag=1;
for(int j=1;j<=tot&&flag;++j)
if(qpow(i,phi/fact[j],x)==1) flag=0;
if(flag) return i;
}
return -1;
}
int limit,rev[MAX_M];
void NTT(int *p,int op)
{
for(int i=0;i<limit;++i) if(i<rev[i]) swap(p[i],p[rev[i]]);
for(int i=1;i<limit;i<<=1)
{
int rot=qpow(op==1?G:iG,(Mod-1)/(i<<1),Mod);
for(int j=0;j<limit;j+=(i<<1))
{
int w=1;
for(int k=0;k<i;++k,w=1ll*w*rot%Mod)
{
int x=p[j+k],y=1ll*w*p[i+k+j]%Mod;
p[j+k]=(x+y)%Mod, p[i+j+k]=(x-y+Mod)%Mod;
}
}
}
if(op==-1)
{
int inv=qpow(limit,Mod-2,Mod);
for(int i=0;i<limit;++i) p[i]=1ll*p[i]*inv%Mod;
}
}
map<int,int>mp;
int N,M,S,X,F[MAX_M],H[MAX_M];
void mul(int *A,int *B,int *C)
{
static int res[MAX_M],a[MAX_M],b[MAX_M];
for(int i=0;i<limit;++i) a[i]=A[i],b[i]=B[i];
NTT(a,1), NTT(b,1);
for(int i=0;i<limit;++i) a[i]=1ll*a[i]*b[i]%Mod;
NTT(a,-1);
for(int i=0;i<M-1;++i) res[i]=(a[i]+a[i+M-1])%Mod;
for(int i=0;i<M-1;++i) C[i]=res[i];
}
int main()
{
// setIO("input");
scanf("%d%d%d%d",&N,&M,&X,&S);
int g=GetRoot(M);
for(int i=0;i<M-1;++i) mp[qpow(g,i,M)]=i;
for(int i=1,x;i<=S;++i)
{
scanf("%d",&x);
x%=M;
if(x) F[mp[x%M]]++;
}
H[mp[1]]=1;
int p=0;
for(limit=1;limit<=2*M;limit<<=1,++p);
for(int i=0;i<limit;++i) rev[i]=(rev[i>>1]>>1)|((i&1)<<(p-1));
while(N)
{
if(N&1) mul(H,F,H);
mul(F,F,F);
N>>=1;
}
printf("%d\n",H[mp[X]]);
return 0;
}
bzoj 3992: [SDOI2015]序列统计 NTT+原根的更多相关文章
- BZOJ 3992: [SDOI2015]序列统计 NTT+快速幂
3992: [SDOI2015]序列统计 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 1155 Solved: 532[Submit][Statu ...
- bzoj 3992: [SDOI2015]序列统计【原根+生成函数+NTT+快速幂】
还是没有理解透原根--题目提示其实挺明显的,M是质数,然后1<=x<=M-1 这种计数就容易想到生成函数,但是生成函数是加法,而这里是乘法,所以要想办法变成加法 首先因为0和任何数乘都是0 ...
- bzoj 3992 [SDOI2015]序列统计——NTT(循环卷积&&快速幂)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3992 有转移次数.模M余数.方案数三个值,一看就是系数的地方放一个值.指数的地方放一个值.做 ...
- bzoj 3992 [SDOI2015] 序列统计 —— NTT (循环卷积+快速幂)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3992 (学习NTT:https://riteme.github.io/blog/2016-8 ...
- BZOJ 3992: [SDOI2015]序列统计 快速幂+NTT(离散对数下)
3992: [SDOI2015]序列统计 Description 小C有一个集合S,里面的元素都是小于M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数列中的每个数都属于集合S ...
- [BZOJ 3992][SDOI2015]序列统计
3992: [SDOI2015]序列统计 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 2275 Solved: 1090[Submit][Stat ...
- BZOJ 3992: [SDOI2015]序列统计 [快速数论变换 生成函数 离散对数]
3992: [SDOI2015]序列统计 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 1017 Solved: 466[Submit][Statu ...
- BZOJ.3992.[SDOI2015]序列统计(DP NTT 原根)
题目链接 \(Description\) 给定\(n,m,x\)和集合\(S\).求\(\prod_{i=1}^na_i\equiv x\ (mod\ m)\)的方案数.其中\(a_i\in S\). ...
- 【BZOJ】3992: [SDOI2015]序列统计 NTT+生成函数
[题意]给定一个[0,m-1]范围内的数字集合S,从中选择n个数字(可重复)构成序列.给定x,求序列所有数字乘积%m后为x的序列方案数%1004535809.1<=n<=10^9,3< ...
随机推荐
- C语言注释风格
注释风格 一.前言 注释是源码程序中非常重要的一部分,一般情况下,源程序有效注释量必须在20%以上. 注释的原则是有助于对程序的阅读理解,所以注释语言必须准确.易懂.简洁,注释不宜太多也不能太少,注释 ...
- ubuntn18 docker zabbix+grafana安装和使用
在ubuntu docker inflxudb(安装 使用 备份 还原 以及python编码) telegraf Grafana我采用telegraf采集数据, 本文计划采用zabbix来才采集数据, ...
- 物联网通讯协议:MQTT,CoAP,NB-IOT,RFID,BLUETOOTH,NFC
一.按网络四层协议分类: NB-IoT,LORA,WIFI,蓝牙,zigbee,4G都是物理层的,这几个都需要芯片模组支持(硬件支持) 而MQTT,COAP,HTTP都是应用层协议,这些需要开发服务器 ...
- C的温习-开头篇1
编译运行C语言可以用很多软件MicrosoftVisualC++.MicrosoftVisualStudio.DEVC++.Code::Blocks.BorlandC++.WaTComC++.Borl ...
- Spring Security OAuth2.0 - AuthorizationServer和ResourceServer分离
<Spring Security实现OAuth2.0授权服务 - 基础版>和<Spring Security实现OAuth2.0授权服务 - 进阶版>两篇文章中介绍如何搭建OA ...
- Java自学-接口与继承 UML图
UML 图 步骤 1 : UML 图 -- 类之间的关系 UML-Unified Module Language 统一建模语言,可以很方便的用于描述类的属性,方法,以及类和类之间的关系 步骤 2 : ...
- AWS EC2 在WINDOWS平台使用FSX
最近在使用AWS FSX产品 折腾了很久才解决,记录下,防止下次再入坑: 使用FSX 必须要使用AD(Active Directory),而一般很少公司会在AWS 把自己公司的域控部署上去. 为了解决 ...
- iOS架构:MVVM设计模式+RAC响应式编程
https://cloud.tencent.com/developer/article/1117009 一:为什么要用MVVM? 为什么要用MVVM?只是因为它不会让我时常懵逼. 每次做完项目过后,都 ...
- pandas-18 reindex用法
pandas-18 reindex用法 pandas中的reindex方法可以为series和dataframe添加或者删除索引. 方法:serise.reindex().dataframe.rein ...
- JavaScript 简单类型和复杂类型区别
一.基本类型 1.概述 值类型又叫做基本数据类型,简单数据类型.在存储时,变量中存储的是值本身,因此叫做值类型 2.基本类型在内存中的存储 基本数据类型存储在栈区中. 3.基本类型作为函数的参数 基本 ...