懒得放传送【大雾

有趣的一道题

前几天刚好听到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 序列统计的更多相关文章

  1. [洛谷P3321][SDOI2015]序列统计

    题目大意:给你一个集合$n,m,x,S(S_i\in(0,m],m\leqslant 8000,m\in \rm{prime},n\leqslant10^9)$,求一个长度为$n$的序列$Q$,满足$ ...

  2. 洛谷P3321 [SDOI2015]序列统计(NTT)

    传送门 题意:$a_i\in S$,求$\prod_{i=1}^na_i\equiv x\pmod{m}$的方案数 这题目太珂怕了……数学渣渣有点害怕……kelin大佬TQL 设$f[i][j]$表示 ...

  3. Luogu 3321 [SDOI2015]序列统计

    BZOJ 3992 点开这道题之后才发现我对原根的理解大概只停留在$998244353$的原根是$3$…… 关于原根: 点我 首先写出$dp$方程,设$f_{i, j}$表示序列长度为$i$当前所有数 ...

  4. 洛咕 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)\)的 像我这 ...

  5. 【洛谷3321_BZOJ3992】[SDOI2015]序列统计(原根_多项式)

    题目: 洛谷3321 分析: 一个转化思路比较神(典型?)的题-- 一个比较显然的\(O(n^3)\)暴力是用\(f[i][j]\)表示选了\(i\)个数,当前积在模\(m\)意义下为\(j\)的方案 ...

  6. 【LG3321】[SDOI2015]序列统计

    [LG3321][SDOI2015]序列统计 题面 洛谷 题解 前置芝士:原根 我们先看一下对于一个数\(p\),它的原根\(g\)有什么性质(好像就是定义): \(g^0\%p,g^1\%p,g^2 ...

  7. BZOJ 3992: [SDOI2015]序列统计 [快速数论变换 生成函数 离散对数]

    3992: [SDOI2015]序列统计 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 1017  Solved: 466[Submit][Statu ...

  8. [SDOI2015]序列统计

    [SDOI2015]序列统计 标签: NTT 快速幂 Description 给你一个模m意义下的数集,需要用这个数集生成一个数列,使得这个数列在的乘积为x. 问方案数模\(1004535809\). ...

  9. 3992: [SDOI2015]序列统计

    3992: [SDOI2015]序列统计 链接 分析: 给定一个集和s,求多少个长度为n的序列,满足序列中每个数都属于s,并且所有数的乘积模m等于x. 设$f=\sum\limits_{i=0}^{n ...

随机推荐

  1. 《Javascript设计模式与开发实践》关于设计模式典型代码的整理:单例模式、策略模式、代理模式、迭代器模式、发布-订阅模式、命令模式、组合模式

    1.单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 使用闭包封装私有变量// 使用闭包创建单例var user = (function () { var _name = 'sven' ...

  2. LRU management

    LRU management 字典树用来查找值,实现map<string,int>操作 tips:tot必须从一开始QAQ #include<bits/stdc++.h> us ...

  3. GoldenGate—日常管理

    Classic Replicat Mode (一)源端和目标端新增加复制表 根据需求将生产库中PROCESS_LOG表通过ogg同步到测试库中:操作步骤: 当GoldenGate仅打开DML复制时,源 ...

  4. data_model_action

    w PowerDesigner

  5. ImportError: libsybdb.so.5: cannot open shared object file: No such file or directory pymssql linux 问题解决 搭建驱动

    [root@hadoop1 nlp]# python sqlserver_t.py Traceback (most recent call last):  File "sqlserver_t ...

  6. Android7.1后对于Toast类型窗口的限制

    在处理问题的时候,经常会遇到ANR,停止运行等问题,经过分析和验证,和如下的一行关键log有关 WindowManager: Adding more than one toast window for ...

  7. linux使用apache发布静态html网页

    环境 centOS7+httpd 安装httpd 安装 #检查是否安装和httpd rpm -qa | grep httpd #如果没安装 yum -y install httpd 启动httpd并验 ...

  8. delphi 神经网络 学习

    https://github.com/uldercarrilho/ParallelNeuralNetwork

  9. python3入门之基础语法

    Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言.Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法 ...

  10. [eclipse中使用Git插件] 008 - git操作pull、merge、stash、commit

    写在前面: 看标题其实还有001-007之类,本来准备写详细的类似教程一样的东东,但是懒了且时间有限(以后或许会补吧),所以跳到008,录下主要的操作. 所以本随笔的重点就是[pull+merge+s ...