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++删除排序数组中的重复项
class Solution { public: int removeDuplicates(vector<int>& nums) { if (nums.empty()) { ; } ...
- python 笔记——生成器和迭代器
#-*- coding:utf-8 -*- a=[1,2,3,4] for i,j in enumerate(a): print i,j '''只有ij时,''' a=[1,2,3,4] for i ...
- async与await总结
全手打原创,转载请标明出处:https://www.cnblogs.com/dreamsqin/p/11533174.html,多谢,=.=~ 抛出3个疑问: 1.async是干哈的? 2.await ...
- FusionInsight大数据开发---SparkStreaming概述
SparkStreaming概述 SparkStreaming是Spark核心API的一个扩展,它对实时流式数据的处理具有可扩展性.高吞吐量.可容错性等特点. SparkStreaming原理 Spa ...
- Replication:The transaction log for database 'tempdb' is full due to 'ACTIVE_TRANSACTION'
今天早上,Dev跟我说,执行query statement时出现一个error,detail info是: “The transaction log for database 'tempdb' is ...
- Replication:The replication agent has not logged a progress message in 10 minutes.
打开Replication Monitor,在Subscription Watch List Tab中,发现有大量的status= “Performance critical” 的黄色Warning, ...
- k8s-Label(标签)
k8s-Label(标签) 一.Label是什么? Label是Kubernetes系统中的一个核心概念.Label以key/value键值对的形式附加到各种对象上,如Pod.Service.RC.N ...
- asp.net core 系列之允许跨域访问2之测试跨域(Enable Cross-Origin Requests:CORS)
这一节主要讲如何测试跨域问题 你可以直接在官网下载示例代码,也可以自己写,我这里直接使用官网样例进行演示 样例代码下载: Cors 一.提供服务方,这里使用的是API 1.创建一个API项目.或者直接 ...
- 象棋中“车”的攻击范围_Java
代码如下: String[][] a = new String[8][8]; int h, l; Scanner scan = new Scanner(System.in); System.out.p ...
- Django---简易图书管理系统(B/S架构)
Django---简易图书管理系统 一丶配置 创建app01 # 1.在具有manage.py文件的目录下,启动cmd,创建一个新的app01 python manage.py startapp ap ...