洛谷3321 SDOI2015 序列统计
懒得放传送【大雾
有趣的一道题
前几天刚好听到Creed_神犇讲到相乘转原根变成卷积的形式
看到这道题当然就会做了啊w
对于m很小 我们暴力找原根 如果你不会找原根的话 出门左转百度qwq
找到原根以后所有数转成原根的幂次然后卷积就吼了啊
多项式卡速米 由于是循环卷积所以每一次还要转回系数相加再转回来
所以是不优美的O(nlg^2n) =v=
代码在这里。
//Love and Freedom.
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define inf 20021225
#define ll long long
#define wph 1004535809ll
#define mxn 810000
using namespace std;
int ksm(int bs,int mi,int mdn)
{
int ans=1;
while(mi)
{
if(mi&1) ans=(ll)ans*bs%mdn;
bs=(ll)bs*bs%mdn; mi>>=1;
}
return ans;
}
int n,m,x,s;
int G,rev[mxn<<1];
int id[mxn];
void find_G()
{
for(int i=2;i<=m;i++)
{
memset(id,0,sizeof(id));
int tmp=1,j;
for(j=0;j<m-1;j++)
{
if(id[tmp]) break;
id[tmp] = j;
tmp*=i; tmp%=m;
}
if(j==m-1){G=i;return;}
}
}
void NTT(int *a,int n,int f)
{
for(int i=0;i<n;i++) if(rev[i]>i)
swap(a[rev[i]],a[i]);
for(int k=2,mid=1;k<=n;k<<=1,mid<<=1)
{
int Wn=ksm(3,(wph-1)/k,wph);
if(f) Wn=ksm(Wn,wph-2,wph);
for(int i=0,w=1;i<n;i+=k,w=1)
for(int j=0;j<mid;j++,w=(ll)w*Wn%wph)
{
int x=a[i+j],y=(ll)w*a[i+mid+j]%wph;
a[i+j]=(x+y)%wph; a[i+mid+j]=(x-y+wph)%wph;
}
}
if(f) for(int i=0,inv=ksm(n,wph-2,wph);i<n;i++)
a[i] = (ll)a[i]*inv%wph;
}
int init(int n)
{
int lim=1,l=0;
while(lim<n) lim<<=1,l++;
for(int i=0;i<lim;i++)
rev[i] = (rev[i>>1]>>1)|((i&1)<<(l-1));
return lim;
}
void poly_ksm(int *ans,int *bs,int n,int mi)
{
//for(int i=0;i<n;i++) printf("%d ",bs[i]);
//printf("\n");
ans[0] = 1;
int lim = init(n<<1);
NTT(ans,lim,0); NTT(bs,lim,0);
//printf("%d\n",ans[0]);
while(mi)
{
if(mi&1)
{
//printf("%d\n",n);
for(int i=0;i<lim;i++)
ans[i] =(ll)ans[i]*bs[i]%wph;
NTT(ans,lim,1);
//ans[0] = 0;
for(int i=0;i<n-1;i++)
ans[i] = (ans[i]+ans[i+n-1])%wph,ans[i+n-1]=0;
NTT(ans,lim,0);
}
for(int i=0;i<lim;i++) bs[i]=(ll)bs[i]*bs[i]%wph;
NTT(bs,lim,1);
//bs[0] = 0;
for(int i=0;i<n-1;i++) bs[i]=(bs[i]+bs[i+n-1])%wph,bs[i+n-1]=0;
NTT(bs,lim,0);
mi>>=1;
}
NTT(ans,lim,1);
//for(int i=0;i<lim;i++) printf("%d ",ans[i]);
}
int a[mxn<<1],ans[mxn<<1];
int main()
{
scanf("%d%d%d%d",&n,&m,&x,&s);
find_G();int t;
for(int i=1;i<=s;i++)
{
scanf("%d",&t);
if(t%m==0) continue;
t%=m; a[id[t]]++;
}
poly_ksm(ans,a,m,n);
printf("%d\n",ans[id[x]]);
return 0;
}
洛谷3321 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]$表示 ...
- Luogu 3321 [SDOI2015]序列统计
BZOJ 3992 点开这道题之后才发现我对原根的理解大概只停留在$998244353$的原根是$3$…… 关于原根: 点我 首先写出$dp$方程,设$f_{i, j}$表示序列长度为$i$当前所有数 ...
- 洛咕 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)\)的 像我这 ...
- 【洛谷3321_BZOJ3992】[SDOI2015]序列统计(原根_多项式)
题目: 洛谷3321 分析: 一个转化思路比较神(典型?)的题-- 一个比较显然的\(O(n^3)\)暴力是用\(f[i][j]\)表示选了\(i\)个数,当前积在模\(m\)意义下为\(j\)的方案 ...
- 【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\). ...
- 3992: [SDOI2015]序列统计
3992: [SDOI2015]序列统计 链接 分析: 给定一个集和s,求多少个长度为n的序列,满足序列中每个数都属于s,并且所有数的乘积模m等于x. 设$f=\sum\limits_{i=0}^{n ...
随机推荐
- asp.net开发微信公众平台----目录汇总-持续更新
1.[c#]asp.net微信公众平台开发(1)数据库设计 2.[c#]asp.net微信公众平台开发(2)多层架构框架搭建和入口实现 3.[c#]asp.net微信公众平台开发(3)微信消息封装及反 ...
- php7新特性的理解和比较
1. null合并运算符(??) ??语法: 如果变量存在且值不为NULL,它就会返回自身的值,否则返回它的第二个操作数. //php7以前 if判断 if(empty($_GET['param']) ...
- (转)YAML最最基础语法
转:https://blog.csdn.net/vincent_hbl/article/details/75411243 正如YAML所表示的YAML Ain’t Markup Language,YA ...
- react-navigation 实战
npm install --save react-navigation 1.测试TabNavigator.StackNavigator和DrawerNavigator (1)新建HomeScreen. ...
- mongodb用户创建及权限控制
转载 2017年03月30日 12:36:15 2169 摘要: MongoDB 3.0 安全权限访问控制,在添加用户上面3.0版本和之前的版本有很大的区别,这里就说明下3.0的添加用户的方法. 环境 ...
- 前端工具-调试压缩后的JS(Source Map的使用)
使用 Source Map 可以在 FF 的调试器. Chrome 的 Sources 和 VSCode 中给压缩前的文件下断点,也可以方便定位错误发生的位置(定位到压缩前的文件). 何为 Sourc ...
- Vagrant 入门 - 同步目录(synced folders)
原文地址 尽管可以非常轻松的启动一台虚拟机,但很少有人希望通过 SSH 使用基于终端的编辑器来编辑文件.幸运的是,借助 Vagrant 你不需要这样做.通过使用同步目录,Vagrant 会自动同步 g ...
- Vagrant 入门 - 启动 vagrant 及 通过 ssh 登录虚拟机
原文地址 在终端运行 vagrant up 命令即可启动 Vagrant 环境: $ vagrant up 不到一分钟,命令就会执行完毕,运行 Ubuntu 的虚拟机会启动成功.Vagrant 运行虚 ...
- 【题解】4879. 【NOIP2016提高A组集训第11场11.9】少女觉
Description 在幽暗的地灵殿中,居住着一位少女,名为古明地觉.据说,从来没有人敢踏入过那座地灵殿,因为人们恐惧于觉一族拥有的能力——读心.掌控人心者,可控天下. 咳咳.人的记忆可以被描述为一 ...
- 字符串类——KMP子串查找算法
1, 如何在目标字符串 s 中,查找是否存在子串 p(本文代码已集成到字符串类——字符串类的创建(上)中,这里讲述KMP实现原理) ? 1,朴素算法: 2,朴素解法的问题: 1,问题:有时候右移一位是 ...