懒得放传送【大雾

有趣的一道题

前几天刚好听到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. 【HDOJ6655】Just Repeat(贪心)

    题意:A和B两个人玩游戏,分别有n和m张牌,A的第i张牌是a[i],B是b[i] 两人轮流出牌,如果一种编号的牌被其中一个人出了另一个人就不能出自己手中这个编号的牌 两人都按最优策略行动,问获胜者 思 ...

  2. 用 margin 还是用 padding ?

    边界(margin):元素周围生成额外的空白区."空白区"通常是指其他元素不能出现且父元素背景可见的区域. 补白(padding):补白位于元素框的边界与内容区之间.很自然,用于影 ...

  3. fiddler抓取火狐浏览器上https协议请求

    前言:现在很多网站采用https协议,当打开fiddler时.浏览https协议的网站会提示不安全,若使用fiddler抓取https协议的请求,则需要向浏览器导入证书,才能抓取https协议的请求, ...

  4. 利用Fiddler对手机应用抓包

    1.启动Fiddler,打开菜单栏中的 Tools > Fiddler Options,打开“Fiddler Options”对话框. 2.在Fiddler Options”对话框切换到“Con ...

  5. PHP 数组函数-数组排序

    php数组排序函数sort ( &$arr [,fruits] ) 对数组进行从低到高排序 ,并赋予新的键名 返回boolrsort ( &$arr [,fruits] ) 对数组进行 ...

  6. sql server 2008查询时报错,消息:8155,没有为'a'的列2指向任何列

    解决方法1: 关掉Sql Server再打开, 重新查询 解决方法2: select T.* from(   select row_number() over(order by age desc) a ...

  7. 通过JS,用a标签代替form中的submit

    ---恢复内容开始--- 有时候在使用表单的时候,不一定会用到表单中的input_submit来提交表单数据,可能会用a.button等来代替 然后自然而然地想到了用JS中的提交表单数据的动作 < ...

  8. Yii中CreateUrl的使用总结

    在Yii中经常要生成URL,不管是为了自动跳转还是仅仅是一个链接.下面对Yii中的URL生成做了一个总结.提示:以下controllerX代表控制器X,actionX代表方法X.在Controller ...

  9. Day3---Python的time库的一些简单函数以及用法

    time库的一些函数 time.time () :   获取当前时间戳,即计算机内部时间值,浮点数 >>>import time >>> time.time() 1 ...

  10. mysql数据库操作指令汇总

    1.mysql -u root -p 登录数据库 2.表结构相同两表数据对拷 insert into A select * from B(插入全部字段数据)   insert into A(字段1.字 ...