懒得放传送【大雾

有趣的一道题

前几天刚好听到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. python-zx笔记10-断言

    断言 断言内容是自动化脚本的重要内容,正确设置断言以后才能帮助我们判断测试用例执行结果. 断言方法 assertEqual(a, b) 判断a==b assertNotEqual(a, b) 判断a! ...

  2. BaseFragment 基类

    package com.test.mvp.mvpdemo.mvp.v6.basemvp; import android.os.Bundle;import android.support.annotat ...

  3. 【数据库】一篇文章搞掂:Oracle数据库

    PL/SQL的使用 1.安装使用 1.1.安装暂略 1.2.使用 添加环境变量 打开PL/SQL,不要登录,进入界面后,打开设置Preference 设置主目录和OCI库

  4. curry柯里化

    Function.prototype.method = function(name,func){ if(!this.prototype[name]){ this.prototype[name] = f ...

  5. linux(centos6) 下安装 postgresql-9.3.1.tar.gz

    目录 一. 环境 二.准备工作 三.先安装 make, gcc ,gcc-c++,readline-devel ,zlib-devel .如果已安装,可以忽略 四.开始安装 4.1 解压 tar -z ...

  6. sql server查询结果复制出来,没有换行(存进去的数据是换行的)

    https://stackoverflow.com/questions/53115490/how-to-correctly-insert-newline-in-nvarchar The problem ...

  7. QT_study

    https://blog.csdn.net/a313827758/article/details/72736552 https://blog.csdn.net/xbcreal/article/deta ...

  8. windowns环境下mysql 安装教程

    windowns环境下mysql 安装教程 一:这里以绿色版安装为例(解压就可以使用) 下载地址: 下载页面:https://dev.mysql.com/downloads/mysql/  2:点击 ...

  9. Linux学习篇(四)-Linux 文件管理命令详解

    rootfs:根文件系统,Root FileSystem 的简称. Linux 文件命名规则 长度不超过255个字符. 不能使用/当文件名. 严格区分大小写. Linux 目录简介 / 根目录 /bo ...

  10. scrapy-redis debug视频

    前言 在上一篇笔记说过会录个视频帮助理解里面的类方法,现在视频来了.只录了debug scheduler.py里面的类方法,还有spiders.py里面的类方法差不多,就不说了,自己动手丰衣足食.限于 ...