[BZOJ3992]序列统计

DP一下,设$f_{i,j}$表示生成$i$个数且乘积$\%M=j$的方案数,则$f_{i+1,l}=\sum\limits_{jk\%M=l}[k\in S]f_{i,j}$

我们很不希望DP式中下标的位置出现乘法,因为这样不好转移,考虑把乘法换成加法

因为模数$M$是质数,所以它有原根,于是对于每个$1\leq x\leq M-1$都有唯一的$0\leq x'\leq M-2$使得$x=g^{x'}$,所以DP式可以写成$f_{i+1,g^{l'}}=\sum\limits_{g^{j'+k'}\%M=g^{l'}}[g^{k'}\in S]f_{i,g^{j'}}$,令$h_{i,j}=f_{i,g^j},S'=\{x|g^x\in S,0\leq x\leq M-2\}$,则$h_{i+1,l}=\sum_{(j+k)\%(M-1)=l}\limits[k\in S']h_{i,j}$,这是卷积的形式($j+k\geq M-1$的项最后加到低次的项中),所以我们可以用FFT做到在$O(n\log_2n)$的时间内从$h_i$转移到$h_{i+1}$

$n$很大,但是每次转移都是一样的,所以只需要快速幂就好了,总时间复杂度$O(M\log_2M\log_2n)$

注意题目给的$S$中是有可能出现$0$的,忽略就好

#include<stdio.h>
#include<string.h>
const int mod=1004535809;
typedef long long ll;
int mul(int a,int b,int p=mod){return a*(ll)b%p;}
int ad(int a,int b){return(a+b)%mod;}
int de(int a,int b){return(a-b)%mod;}
void swap(int&a,int&b){a^=b^=a^=b;}
int rev[40010],N,iN,m;
int pow(int a,int b){int s=1;while(b){if(b&1)s=mul(s,a);a=mul(a,a);b>>=1;}return s;
}
void pre(int n){int i,k;for(N=1,k=0;N<n;N<<=1)k++;for(i=0;i<N;i++)rev[i]=(rev[i>>1]>>1)|((i&1)<<(k-1));iN=pow(N,mod-2);
}
void ntt(int*a,int on){int i,j,k,t,w,wn;for(i=0;i<N;i++){if(i<rev[i])swap(a[i],a[rev[i]]);}for(i=2;i<=N;i<<=1){wn=pow(3,(on==1)?(mod-1)/i:(mod-1-(mod-1)/i));for(j=0;j<N;j+=i){w=1;for(k=0;k<i>>1;k++){t=mul(w,a[i/2+j+k]);a[i/2+j+k]=de(a[j+k],t);a[j+k]=ad(a[j+k],t);w=mul(w,wn);}}}if(on==-1){for(i=0;i<N;i++)a[i]=mul(a[i],iN);}
}
struct poly{int n,a[40010];poly(){n=0;memset(a,0,sizeof(a));}
};
poly operator*(poly x,poly y){int i;poly c;pre(x.n+y.n+1);ntt(x.a,1);ntt(y.a,1);for(i=0;i<N;i++)c.a[i]=mul(x.a[i],y.a[i]);ntt(c.a,-1);for(i=m-1;i<N;i++){c.a[i%(m-1)]=ad(c.a[i%(m-1)],c.a[i]);c.a[i]=0;}c.n=m-2;return c;
}
int getg(int p){int i,j,t;for(i=2;i<p;i++){t=1;for(j=1;j<p-1;j++){t=mul(t,i,p);if(t==1)break;}if(j==p-1)break;}return i;
}
int s[8010],r[8010];
poly pow(poly a,int b){poly s;s.a[0]=1;while(b){if(b&1)s=s*a;a=a*a;b>>=1;}return s;
}
int main(){int n,x,ss,i,g,b;poly a;scanf("%d%d%d%d",&n,&m,&x,&ss);for(i=1;i<=ss;i++)scanf("%d",s+i);g=getg(m);b=1;for(i=0;i<m-1;i++){r[b]=i;b=mul(b,g,m);}for(i=1;i<=ss;i++){if(s[i])a.a[r[s[i]]]=1;}a.n=m-2;while(a.a[a.n]==0)a.n--;a=pow(a,n);printf("%d",(a.a[r[x]]+mod)%mod);
}

转载于:https://www.cnblogs.com/jefflyy/p/8717294.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/254981.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

socket,TCP/IP的理解(转)

TCP/IP 要想理解socket首先得熟悉一下TCP/IP协议族&#xff0c; TCP/IP&#xff08;Transmission Control Protocol/Internet Protocol&#xff09;即传输控制协议/网间协议&#xff0c;定义了主机如何连入因特网及数据如何再它们之间传输的标准&#xff0c; 从字面意思来看TCP…

最小中间和

题目描述 给定一个正整数序列a1,a2,...,an&#xff0c;不改变序列中的每个元素在序列中的位置&#xff0c;把它们相加&#xff0c;并用括号记每次加法所得的和&#xff0c;称为中间和。编程&#xff1a;找到一种方法&#xff0c;添上n-1对括号&#xff0c;加法运算依括号顺序进…

HALCON示例程序measure_metal_part_extended.hdev金属零件尺寸测量

HALCON示例程序measure_metal_part_extended.hdev金属零件尺寸测量 示例程序源码&#xff08;加注释&#xff09; 关于显示类函数解释 dev_update_off () read_image (Image, ‘metal-parts/metal-parts-01’) init_visualization (Image, 3, ‘white’, ‘margin’, Width, …

双目匹配与视差计算

立体匹配主要是通过找出每对图像间的对应关系&#xff0c;根据三角测量原理&#xff0c;得到视差图&#xff1b;在获得了视差信息后&#xff0c;根据投影模型很容易地可以得到原始图像的深度信息和三维信息。立体匹配技术被普遍认为是立体视觉中最困难也是最关键的问题&#xf…

JavaEE 银联支付之网站支付-消费类交易

以银联网站支付 - 消费类交易 为例 0. 大致逻辑 前端request->后台封装参数->后台进行签名->生成跳转页面&#xff08;包含表单提交内容&#xff09;->响应前端&#xff08;将生成的html写到浏览器中完成自动跳转打开银联支付页面&#xff09; 复制代码1.acp_sdk.p…

react 开发知识准备

react react使用教程 babel babel 可用于ES6转换为ES5&#xff0c;jsx转换为原生js。 ES6 ES6 语法 webpack webpack打包工具&#xff0c;它把不同的、相互依赖的静态资源都视作模块&#xff0c;并且打包成我们想要的静态资源。让代码组织更清晰&#xff0c;一个文件就是一个模…

Linux多线程编程(不限Linux)

——本文一个例子展开&#xff0c;介绍Linux下面线程的操作、多线程的同步和互斥。 前言 线程&#xff1f;为什么有了进程还需要线程呢&#xff0c;他们有什么区别&#xff1f;使用线程有什么优势呢&#xff1f;还有多线程编程的一些细节问题&#xff0c;如线程之间怎样同步、…

概率论与数理统计-ch8-假设检验

1、假设检验 在总体的分布函数未知或只知其形式、不知其参数的情况下&#xff0c;为了推断总体的某些未知特性&#xff0c;提出关于总体的假设&#xff0c;然后根据样本数据对提出的假设做出接受或拒绝的决策。 步骤&#xff1a; 提出原假设--确定建立在样本基础上的检验统计量…

HALCON示例程序measure_metal_part_first_example.hdev通过拟合边缘进行尺寸测量

HALCON示例程序measure_metal_part_first_example.hdev通过拟合边缘进行尺寸测量 示例程序源码&#xff08;加注释&#xff09; 关于显示类函数解释 dev_update_off () read_image (Image, ‘metal-parts/metal-parts-01’) get_image_size (Image, Width, Height) dev_close…

简单实现仿某宝地址选择三级联动样式

内容简单介绍实现步骤第一步 找准方向第二步 开干总结还是题外话内容简单介绍 简单看一下须要实现的效果&#xff0c;如图&#xff1a; 实现步骤 第一步 找准方向 事实上就是想好要用recyclerview而不是listview。假设要问我recyclerview是什么的话。。 第二步 开干 首先须要先…

opencv双目测距实现

虽然最近注意力已经不可遏制地被神经科学、大脑记忆机制和各种毕业活动吸引过去了&#xff0c;但是还是觉得有必要把这段时间双目视觉方面的进展总结一下。毕竟从上一篇博文发表之后&#xff0c;很多同仁发E-mail来与我讨论&#xff0c;很多原来的疑团&#xff0c;也在讨论和一…

logback高级特性使用-异步记录日志

注意&#xff1a;该功能需要高版本才能支持&#xff0c;如1.0.11。AsyncAppender&#xff0c;异步记录日志。 工作原理&#xff1a; 当Logging Event进入AsyncAppender后&#xff0c;AsyncAppender会调用appender方法&#xff0c;append方法中在将event填入Buffer(这里选用的数…

Linux下c开发 之 线程通信(转)

1.Linux“线程”进程与线程之间是有区别的&#xff0c;不过Linux内核只提供了轻量进程的支持&#xff0c;未实现线程模型。Linux是一种“多进程单线程”的操作系统。Linux本身只有进程的概念&#xff0c;而其所谓的“线程”本质上在内核里仍然是进程。大家知道&#xff0c;进程…

HDU 1028 Ignatius and the Princess III

//强行递推。 xx[i][j]表示i数中第j个开头的组合种类。 /* 最终结果[i]为 sum of(xx[i][j]) (j from 1 to i); xx[i][j]sum of (xx[i-j][k]) (k from 1 to j); 例如 xx[10][4]xx[6][1]xx[6][2]xx[6][3]xx[6][4]; xx[6][1] 1; 6111111; xx[6][2]3; 6222, 62211, 621111; xx[…

HALCON示例程序measure_metal_part_id.hdev使用xld边缘拟合检测零件加工是否合格

HALCON示例程序measure_metal_part_id.hdev使用xld边缘拟合检测零件加工是否合格 示例程序源码&#xff08;加注释&#xff09; 关于显示类函数解释 dev_update_off () Imagefiles : [‘metal-parts/metal-part-model-01’,‘metal-parts/metal-parts-01’,‘metal-parts/meta…

编写批处理文件-------基础

第一、Windows bat 批处理文件 编写 如何编写批处理文件 批处理文件&#xff08;batch file&#xff09;包含一系列 DOS命令&#xff0c;通常用于自动执行重复性任务。 用户只需双击批处理文件便可执行任务&#xff0c;而无需重复输入相同指令。编写批处理文件非常简单&#xf…

主控芯片

主控芯片&#xff1a; 主控芯片里有310&#xff0c;320,3288&#xff0c;288,318&#xff0c;333&#xff0c;345&#xff0c;7501, 其中310是中星微发展比较早&#xff0c;比较成熟的芯片。在现在一般应用在水晶夹子之类的低端产品上。 3288也是低端芯片&#xff0c;318&…

MPEG2、H.263、H.264协议效率对比

[摘录]1.1 MPEG2、H.263、H.264协议效率对比ITUT中定义的双向视频通信协议族包括&#xff1a;H.320、H.323&#xff0c;这两个协议族中&#xff0c;包含了很多子协议&#xff0c;例如音频编码协议、视频编码协议等&#xff0c;其中视频编码包括&#xff1a;H.261、H.263、H.264…

WebService SOAP、Restful和HTTP(post/get)请求区别

web service&#xff08;SOAP&#xff09; Webservice的一个最基本的目的就是提供在各个不同平台的不同应用系统的协同工作能力。 Web service 就是一个应用程序&#xff0c;它向外界暴露出一个能够通过Web进行调用的API。 SOAP是一种简单基于xml的轻量协议&#xff0c;用户web…

Block的循环引用详解

1.首先我们创建了一个网络请求工具类 然后storyboard里面去创建了一个导航控制器 并且把它设置为初始控制器 然后拖入一个bar button &#xff0d;&#xff0d;show&#xff0d;&#xff0d;到自带的控制器 这个时候运行代码的结果是 x 显然这个时候没有造成循环引用 为什…