BZOJ3992: [SDOI2015]序列统计
Description
Input
一行,四个整数,N、M、x、|S|,其中|S|为集合S中元素个数。第二行,|S|个整数,表示集合S中的所有元素。
Output
一行,一个整数,表示你求出的种类数mod 1004535809的值。
Sample Input
1 2
Sample Output
HINT
- #include<cstdio>
- #include<cctype>
- #include<queue>
- #include<cstring>
- #include<algorithm>
- #define rep(i,s,t) for(int i=s;i<=t;i++)
- #define dwn(i,s,t) for(int i=s;i>=t;i--)
- #define ren for(int i=first[x];i;i=next[i])
- using namespace std;
- const int BufferSize=1<<16;
- char buffer[BufferSize],*head,*tail;
- inline char Getchar() {
- if(head==tail) {
- int l=fread(buffer,1,BufferSize,stdin);
- tail=(head=buffer)+l;
- }
- return *head++;
- }
- inline int read() {
- int x=0,f=1;char c=Getchar();
- for(;!isdigit(c);c=Getchar()) if(c=='-') f=-1;
- for(;isdigit(c);c=Getchar()) x=x*10+c-'0';
- return x*f;
- }
- const int maxn=18010;
- const int p=1004535809;
- const int G=3;
- const int NUM=15;
- typedef long long ll;
- ll wn[maxn],inv;
- ll pow(ll n,ll m,ll mod=p) {
- ll ans=1;
- for(;m;m>>=1,(n*=n)%=mod) if(m&1) (ans*=n)%=mod;
- return ans;
- }
- void NTT(ll* A,int len,int tp) {
- int j=len>>1,c=0;
- rep(i,1,len-2) {
- if(i<j) swap(A[i],A[j]);int k=len>>1;
- while(j>=k) j-=k,k>>=1;j+=k;
- }
- for(int i=2;i<=len;i<<=1) {
- c++;
- for(int j=0;j<len;j+=i) {
- ll w=1;
- for(int k=j;k<j+(i>>1);k++) {
- ll u=A[k],t=w*A[k+(i>>1)]%p;
- A[k]=(u+t)%p;A[k+(i>>1)]=(u-t+p)%p;
- (w*=wn[c])%=p;
- }
- }
- }
- if(tp<0) {
- rep(i,1,len/2-1) swap(A[i],A[len-i]);
- ll inv=pow(len,p-2);
- rep(i,0,len-1) (A[i]*=inv)%=p;
- }
- }
- int check(int g,int m) {
- for(int i=2;i*i<m;i++) if((m-1)%i==0&&(pow(g,i,m)==1||pow(g,(m-1)/i,m)==1)) return 0;
- return 1;
- }
- int n,m,X,S,len,gs=2,c[maxn];
- ll D[maxn];
- void mul(ll* A,ll* B) {
- rep(i,0,len-1) D[i]=B[i];
- NTT(A,len,1);NTT(D,len,1);
- rep(i,0,len-1) (A[i]*=D[i])%=p;
- NTT(A,len,-1);
- dwn(i,len-1,m-1) (A[i-m+1]+=A[i])%=p,A[i]=0;
- }
- ll A[maxn],B[maxn];
- int main() {
- rep(i,0,NUM-1) wn[i]=pow(G,(p-1)/(1<<i));
- n=read();m=read();X=read();S=read();
- len=1;while(len<=(m<<1)) len<<=1;
- while(!check(gs,m)) gs++;
- int m0=1;c[1]=0;
- rep(i,1,m-2) (m0*=gs)%=m,c[m0]=i;
- rep(i,1,S) {
- int x=read()%m;
- if(x) A[c[x]]=1;
- }
- B[0]=1;
- for(;n;mul(A,A),n>>=1) if(n&1) mul(B,A);
- printf("%lld\n",B[c[X]]);
- return 0;
- }
BZOJ3992: [SDOI2015]序列统计的更多相关文章
- [BZOJ3992][SDOI2015]序列统计(DP+原根+NTT)
3992: [SDOI2015]序列统计 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 1888 Solved: 898[Submit][Statu ...
- BZOJ3992: [SDOI2015]序列统计(NTT 原根 生成函数)
题意 题目链接 给出大小为\(S\)的集合,从中选出\(N\)个数,满足他们的乘积\(\% M = X\)的方案数 Sol 神仙题Orz 首先不难列出最裸的dp方程,设\(f[i][j]\)表示选了\ ...
- 2018.12.31 bzoj3992: [SDOI2015]序列统计(生成函数+ntt+快速幂)
传送门 生成函数简单题. 题意:给出一个集合A={a1,a2,...as}A=\{a_1,a_2,...a_s\}A={a1,a2,...as},所有数都在[0,m−1][0,m-1][0,m− ...
- 【动态规划】bzoj3992 [Sdoi2015]序列统计 10分
#include<cstdio> using namespace std; #define MOD 1004535809 int a[8001],f[1001][101],n,m,x,S; ...
- 【NTT】bzoj3992: [SDOI2015]序列统计
板子题都差点不会了 Description 小C有一个集合S,里面的元素都是小于M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数 列,数列中的每个数都属于集合S.小C用这个生成器生 ...
- BZOJ3992 [SDOI2015]序列统计 【生成函数 + 多项式快速幂】
题目 小C有一个集合S,里面的元素都是小于M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数 列,数列中的每个数都属于集合S.小C用这个生成器生成了许多这样的数列.但是小C有一个问题 ...
- 【BZOJ3992】[SDOI2015]序列统计 NTT+多项式快速幂
[BZOJ3992][SDOI2015]序列统计 Description 小C有一个集合S,里面的元素都是小于M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数列中的每个数都属 ...
- 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\). ...
随机推荐
- 查看Linux分区格式
第一种方法: 使用mount [root@ol6-121-rac1 ~]# mount /dev/mapper/vg_ol6121rac1-lv_root on / type ext4 (rw) ...
- Install PIL on mac osX10.9
follow this instruction: http://blog.csdn.net/liushuaikobe/article/details/8729652 and if you encoun ...
- 攻城狮在路上(叁)Linux(二十九)--- 完整备份工具:dump以及restore
一.dump命令: 该命令既可以针对整个文件系统进行备份,也可以仅针对目录来备份.还可以指定不同的备份等级(-0~-9共10个等级). dump -W:列出在/etc/fstab中具有dump设置的分 ...
- AOP常用术语
1.连接点(Joinpoint) 程序执行的某个特定位置:如类开始初始化前,类初始化后,类某个方法调用前,调用后,方法跑出异常后.一个类或一段程序代码拥有一些具有边界性质的特定点.这些代码中的特定点就 ...
- iphone手机不同版本兼容、横竖屏
/* 兼容问题*/ @media screen and (device-width: 320px) and (device-height: 480px) and (-webkit-device-pix ...
- JQuery 操作对象的属性值
通过JQuery去操作前台对象(div,span...)的属性是很常见的事情,本文就简单的介绍几种操作情形. 1):通过属性值去获取对象 2):用JQuery去修改对象的属性值 3):获取并修改对象的 ...
- ASP.NET MVC使用过滤器进行权限控制
1.新建MVC项目 2.找到Models文件夹,新建 LoginCheckFilterAttribute 类 public class LoginCheckFilterAttribute : Acti ...
- Android自动化压力测试之Monkey Test Android常见的错误类型及黑白名单的使用方法(四)
Android常见的错误类型有两种 1.ANR类型 1)在5秒内没有响应输入的事件(例如,按键按下,屏幕触摸) 2)BroadcastReceiver在10秒内没有执行完毕 2.Crash类型 1)异 ...
- 为什么调用 FragmentPagerAdapter.notifyDataSetChanged() 并不能更新其 Fragment?
在一个 Android 应用中,我使用 FragmentPagerAdapter 来 处理多 Fragment 页面的横向滑动.不过我碰到了一个问题,即当 Fragment 对应的数据集发生改变时,我 ...
- linux服务器init 5启动图形界面,报错Retrigger failed udev events
今天因工作需要开启linux系统的桌面环境,使用startx未成功,报如下错误: [root@ /]# startx xauth: creating new authority xinit: No s ...