bzoj3992
题解:
求模素数 p 原根的方法:对 p-1 进行素因子分解,记pi为p-1的第i个因子,若恒有a^((p-1)/pi) mod p ≠ 1 成立,则 a 就是 p 的原根。(对于合数求原根,只需把 p-1 换成 phi(p) 即可)
首先比较暴力是f[i][j]表示前i个,乘积为j
然后是n*m^2的
我们可以利用原根将每个数变成g^x
这样就变成了加和
可以利用生成函数的思想
然后分治+fft就可以了
代码:
#include <bits/stdc++.h>
using namespace std;
#define rint register int
#define rep(i,h,t) for(rint i=h;i<=t;i++)
#define dep(i,t,h) for(rint i=t;i>=h;i--)
#define IL inline
const double pi=acos(-1.0);
const int N=3e4;
int n,m,l,r[N],a[N],b[N],w[N],c[N],g,kk,G=;
int p=;
IL int fsp(int x,int y,int p)
{
int ans=;
while (y)
{
if(y&) ans=1ll*ans*x%p;
x=1ll*x*x%p;
y>>=;
}
return ans;
}
IL void jf(int &x,int y)
{
x+=y;
if (x>p) x-=p;
}
IL void fft(int *a,int o)
{
rep(i,,n-) if (i>r[i]) swap(a[i],a[r[i]]);
for (int i=;i<n;i*=)
{
int wn=fsp(G,(p-)/(i*),p); w[]=;
rep(j,,i-) w[j]=(1ll*w[j-]*wn)%p;
for (int j=;j<n;j+=(i*))
{
int *x=a+j,*y=a+i+j;
for (rint k=;k<i;k++)
{
const int t=(1ll*w[k]*y[k])%p;
y[k]=x[k]-t; if (y[k]<) y[k]+=p;
x[k]+=t; if (x[k]>p) x[k]-=p;
}
}
}
if (o==-)
{
reverse(&a[],&a[n]);
for (int i=,inv=fsp(n,p-,p);i<n;i++)
a[i]=1ll*a[i]*inv%p;
rep(i,kk,m)
jf(a[i%kk],a[i]),a[i]=;
}
}
IL void query()
{
l=;
for (n=;n<=m;n<<=) l++;
rep(i,,n-) r[i]=(r[i/]/)|((i&)<<(l-));
fft(a,); fft(b,);
rep(i,,n-) a[i]=1ll*a[i]*b[i]%p;
fft(a,-);
}
IL void get_g(int x)
{
rep(i,,x-)
{
int j;
for (j=;j<m;j++)
if (fsp(i,j,m)==) break;
if (j==m-)
{
g=i; break;
}
}
}
struct re{
int a[N];
}now;
re fsp2(int x)
{
if (x==) return(now);
re tmp=fsp2(x/);
memcpy(b,tmp.a,sizeof(tmp.a));
memcpy(a,tmp.a,sizeof(tmp.a));
query();
if (x%)
{
memcpy(b,c,sizeof(c));
query();
}
memcpy(tmp.a,a,sizeof(a));
return(tmp);
}
int f[N];
int main()
{
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
ios::sync_with_stdio(false);
int x,s;
cin>>n>>m>>x>>s; kk=m-;
rep(i,,s) cin>>a[i];
get_g(m);
rep(i,,m-) f[fsp(g,i,m)]=i;
m*=;
rep(i,,s) if (a[i]) now.a[f[a[i]]]++,c[f[a[i]]]++;
fsp2(n);
cout<<(a[f[x]]+p)%p;
return ;
}
bzoj3992的更多相关文章
- 【BZOJ3992】序列统计(动态规划,NTT)
[BZOJ3992]序列统计(动态规划,NTT) 题面 BZOJ 题解 最裸的暴力 设\(f[i][j]\)表示前\(i\)个数,积在膜意义下是\(j\)的方案数 转移的话,每次枚举一个数,直接丢进去 ...
- 【bzoj3992】 SDOI2015—序列统计
http://www.lydsy.com/JudgeOnline/problem.php?id=3992 (题目链接) 题意 集合${S}$中有若干个不超过${m}$的非负整数,问由这些数组成一个长度 ...
- [BZOJ3992][SDOI2015]序列统计(DP+原根+NTT)
3992: [SDOI2015]序列统计 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 1888 Solved: 898[Submit][Statu ...
- 【BZOJ3992】[SDOI2015]序列统计 NTT+多项式快速幂
[BZOJ3992][SDOI2015]序列统计 Description 小C有一个集合S,里面的元素都是小于M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数列中的每个数都属 ...
- BZOJ3992: [SDOI2015]序列统计
Description 小C有一个集合S,里面的元素都是小于M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数列中的每个数都属于集合S. 小C用这个生成器生成了许多这样的数列. ...
- Bzoj3992:[SDOI2015]序列统计
题面 Bzoj Sol pts 1 大暴力很简单,\(f[i][j]\)表示到第\(i\)个位置,前面积的模为\(j\)的方案 然后可以获得\(10\)分的好成绩 # include <bits ...
- 【BZOJ3992】【SDOI2015】序列统计 原根 NTT
题目大意 有一个集合\(s\),里面的每个数都\(\geq0\)且\(<m\). 问有多少个长度为\(n\)的数列满足这个数列所有数的乘积模\(m\)为\(x\).答案模\(1004535809 ...
- 【BZOJ3992】【SDOI2015】序列统计
数论劲啊 原题: 小C有一个集合S,里面的元素都是小于M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数列中的每个数都属于集合S. 小C用这个生成器生成了许多这样的数列.但是小 ...
- 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− ...
随机推荐
- 题解-poj3682King Arthur's Birthday Celebration
Problem poj-3682 题目大意:抛一次硬币有\(p\)的概率得到正面,当有\(n\)次正面时停止,抛第\(i\)次的花费为\(2i-1\),求抛的期望次数和期望花费 Solution 本来 ...
- backtrace和backtrace_symbols
一般察看函数运行时堆栈的方法是使用GDB(bt命令)之类的外部调试器,但是,有些时候为了分析程序的BUG,(主要针对长时间运行程序的分析),在程序出错时打印出函数的调用堆栈是非常有用的. 在glibc ...
- LA 3263 (欧拉定理)
欧拉定理题意: 给你N 个点,按顺序一笔画完连成一个多边形 求这个平面被分为多少个区间 欧拉定理 : 平面上边为 n ,点为 c 则 区间为 n + 2 - c: 思路: 先扫,两两线段的交点,存下来 ...
- 【原创】大数据基础之Logstash(3)应用之http(in和out)
一个logstash很容易通过http打断成两个logstash实现跨服务器或者跨平台间数据同步,比如原来的流程是 logstash: nginx log -> kafka 打断成两个是 log ...
- layui前端框架
项目中需要弹出层效果,使用了layui前端框架,主要使用了里面的弹出层特效(可以移动) html代码 要给这个标签绑定click方法 <a href='javascript:;' data-me ...
- jquery easyui datagrid 加每页合计和总合计
jquery easyui datagrid 加每页合计和总合计 一:效果图 二:代码实现 这个只有从后台来处理 后台根据rows 和page两个参数返回的datatable 命名为dt 然后根据dt ...
- 移动端点击出现阴影 css解决方案
a,img,button,input,textarea,div{-webkit-tap-highlight-color:rgba(255,255,255,0);}
- leetcode(js)算法89之格雷编码
格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异. 给定一个代表编码总位数的非负整数 n,打印其格雷编码序列.格雷编码序列必须以 0 开头 示例 1: 输入: 2 输出: [ ...
- jQuery为div添加select和option
简单描述:用jQuery给页面添加select下拉框,直接上图 总结:清楚明了^_^
- 《剑指offer》旋转数组中的最小数字
本题来自<剑指offer> 旋转数组中的最小数字 题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例 ...