洛咕 P3321 [SDOI2015]序列统计
显然dp就是设\(f[i][j]\)表示dp了i轮,对m取膜是j的方案数
\(f[i][xy\mod m]=f[i-1][x]\times f[i-1][y]\)
这是\(O(nm^2)\)的
像我这样的蒟蒻都能想到用类似快速幂一样的东西来转移是吧,那么就\(O(log_2 nm^2)\)了
非常难受,还是过不去
如果可以优化一下dp转移就好了,比如把乘改成加,就能用NTT了
然后就要用到一个叫做原根的东西,学NTT的时候只是记了一下不知道这货有啥用
质数\(m\)原根\(g\)的性质:对\(m-1\)进行唯一分解,\(m-1=p_1^{a_1}p_2^{a_2}\cdots p_k^{a_k}\),\(g\)对任何一个\(i\)都满足\(g^{\frac{m-1}{p_i}}\neq 1\)
然后,这个题要用到的就是,\(g^0,g^1,\cdots,g^{m-2}\)互不相同
那么,把原来f[1][i]变成f[1][g^{i-1}],就可以一一对应了,又把乘变成了加
#include<bits/stdc++.h>
#define il inline
#define vd void
#define int ll
#define mod 1004535809
typedef long long ll;
il int gi(){
int x=0,f=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')f=-1;
ch=getchar();
}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
il int Pow(int x,int y,int mo){
int ret=1;
while(y){
if(y&1)ret=ret*x%mo;
x=x*x%mo;y>>=1;
}
return ret;
}
const int G=3,iG=Pow(G,mod-2,mod);
int n,m,qx,k,F[8000];
struct yyb{
ll f[8000];
yyb(){memset(f,0,sizeof f);}
};
ll N,lg,rev[1<<14],P[1<<14],iP[1<<14],invN;
il vd ntt(ll*A,int n,int t){
for(int i=0;i<n;++i)if(rev[i]>i)std::swap(A[i],A[rev[i]]);
for(int o=1;o<n;o<<=1){
int W=t?P[o]:iP[o];
for(int*p=A;p!=A+n;p+=o<<1)
for(int i=0,w=1;i<o;++i,w=w*W%mod){
int t=w*p[i+o]%mod;
p[i+o]=(p[i]-t+mod)%mod;p[i]=(p[i]+t)%mod;
}
}
if(!t)for(int i=0;i<n;++i)A[i]=A[i]*invN%mod;
}
il yyb mul(const yyb&a,const yyb&b){
static int A[1<<14],B[1<<14];
memset(A,0,N*8),memset(B,0,N*8);
memcpy(A,a.f,sizeof a.f),memcpy(B,b.f,sizeof b.f);
ntt(A,N,1),ntt(B,N,1);
for(int i=0;i<N;++i)A[i]=A[i]*B[i]%mod;
ntt(A,N,0);
yyb ret;
for(int i=0;i<=m*2;++i)(ret.f[i%(m-1)]+=A[i])%=mod;
return ret;
}
signed main(){
n=gi(),m=gi(),qx=gi(),k=gi();
int gM;
{//get gM
int p[10],tot=0;
for(int x=m-1,i=2;i<=x;++i)
if(x%i==0){
p[++tot]=i;
while(x%i==0)x/=i;
}
for(int i=2;i<=m;++i){
for(int j=1;j<=tot;++j)if(Pow(i,(m-1)/p[j],m)==1)goto gg;
gM=i;break;gg:;
}
for(int i=0,j=1;i<m-1;++i,j=j*gM%m)F[j]=i;
}
N=1,lg=0;while(N<m<<1)N<<=1,++lg;
for(int i=0;i<N;++i)rev[i]=(rev[i>>1]>>1)|((i&1)<<lg-1);
for(int i=1;i<N;i<<=1)P[i]=Pow(G,(mod-1)/(i<<1),mod),iP[i]=Pow(iG,(mod-1)/(i<<1),mod);
invN=Pow(N,mod-2,mod);
yyb X,ans;
int t;
while(k--){
t=gi();
if(t)X.f[F[t]]=1;
}
ans.f[F[1]]=1;
while(n){
if(n&1)ans=mul(ans,X);
X=mul(X,X);n>>=1;
}
printf("%lld\n",ans.f[F[qx]]);
return 0;
}
洛咕 P3321 [SDOI2015]序列统计的更多相关文章
- [洛谷P3321][SDOI2015]序列统计
题目大意:给你一个集合$n,m,x,S(S_i\in(0,m],m\leqslant 8000,m\in \rm{prime},n\leqslant10^9)$,求一个长度为$n$的序列$Q$,满足$ ...
- 洛谷P3321 [SDOI2015]序列统计(NTT)
传送门 题意:$a_i\in S$,求$\prod_{i=1}^na_i\equiv x\pmod{m}$的方案数 这题目太珂怕了……数学渣渣有点害怕……kelin大佬TQL 设$f[i][j]$表示 ...
- P3321 [SDOI2015]序列统计 FFT+快速幂+原根
\(\color{#0066ff}{ 题目描述 }\) 小C有一个集合S,里面的元素都是小于M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数列中的每个数都属于集合S.小C用这 ...
- P3321 [SDOI2015]序列统计
思路 首先有个挺显然的DP \[ dp[i][(j*k)\%m]+=dp[i-1][j]\times dp[i-1][k] \] 想办法优化这个DP 这个dp也可以写成这样 \[ dp[i][j]=\ ...
- Luogu P3321 [SDOI2015]序列统计
一道不错的多项式好题.还涉及了一些数论内容. 首先我们看到题目是求乘积模\(m\)的方案数,考虑到这种方案数我们一般都可以用生成函数来做. 但显然卷积的下标有加(FFT,NTT等)有位运算(FWT)但 ...
- 洛谷3321 SDOI2015 序列统计
懒得放传送[大雾 有趣的一道题 前几天刚好听到Creed_神犇讲到相乘转原根变成卷积的形式 看到这道题当然就会做了啊w 对于m很小 我们暴力找原根 如果你不会找原根的话 出门左转百度qwq 找到原根以 ...
- 【LG3321】[SDOI2015]序列统计
[LG3321][SDOI2015]序列统计 题面 洛谷 题解 前置芝士:原根 我们先看一下对于一个数\(p\),它的原根\(g\)有什么性质(好像就是定义): \(g^0\%p,g^1\%p,g^2 ...
- BZOJ 3992: [SDOI2015]序列统计 [快速数论变换 生成函数 离散对数]
3992: [SDOI2015]序列统计 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 1017 Solved: 466[Submit][Statu ...
- [SDOI2015]序列统计
[SDOI2015]序列统计 标签: NTT 快速幂 Description 给你一个模m意义下的数集,需要用这个数集生成一个数列,使得这个数列在的乘积为x. 问方案数模\(1004535809\). ...
随机推荐
- 更改SQL实例端口
为SQL Server使用非标准的端口 你正在使用标准的端口号1433来连接SQL Server 2005吗?你考虑过设置SQL Server来监听一个不同于1433的端口号吗?我曾经就是这样.在这篇 ...
- 审计系统---初识堡垒机180501【all】
堡垒机背景[审计系统] SRE是指Site Reliability Engineer (/运维工程师=运行维护 业务系统) 运维: 维护系统,维护业务,跟业务去走 防火墙: 禁止不必要的访问[直接访问 ...
- 关于 svn
文章:http://www.cnblogs.com/xing901022/p/4403339.html 视频http://www.imooc.com/learn/109 7******* ...
- windows 2012R2 上必须要用sharepoint 2013 sp1.
已经确认. 虽然有人讲以下powershell可以帮助安装sharepoint 2013. 不过不是每次都可以的 Import-Module ServerManager Add-WindowsFeat ...
- JedisPool无法获得资源问题
线上碰到一个问题:redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the ...
- css3动画效果小结
css3的动画功能有以下三种: 1.transition(过度属性) 2.animation(动画属性) 3.transform(2D/3D转换属性) 下面逐一进行介绍我的理解: 1.transiti ...
- AE-----界面介绍
AE-----界面介绍 一.大纲leiji 层级: 比如:高楼一层一层的盖起来的.千层蛋糕(一层一层的).地质(一层一层构造的) 图层的特征:有顺序.上面的一层总会覆盖掉下面的一层. AfterEff ...
- virtualbox+vagrant学习-2(command cli)-6-vagrant init命令
Init——创建Vagrantfile文件 格式: vagrant init [options] [name [url]] 通过创建初始的Vagrantfile文件(如果不存在的话),将当前目录初始化 ...
- Java反射学习四
利用反射调用私有方法.访问私有属性 利用反射,首先是Class对象的获取,之后是Method和Field对象的获取. 以Method为例,从文档中可以看到: getMethod()方法返回的是publ ...
- 【转】对H264进行RTP封包原理
1. 引言 H.264/AVC 是ITU-T 视频编码专家组(VCEG)和ISO/IEC 动态图像专家组(MPEG )联合组成的联合视频组(JVT)共同努力制订的新一代视频编码标准,它最大的优 ...