博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LOJ #2183「SDOI2015」序列统计
阅读量:7194 次
发布时间:2019-06-29

本文共 1897 字,大约阅读时间需要 6 分钟。

有好多好玩的知识点

题意:在集合中选$ n$个元素(可重复选)使得乘积模$ m$为$ x$,求方案数对$ 1004535809$取模

$ n<=10^9,m<=8000且是质数,集合大小不超过m$


$ Solution:$

我们先考虑改乘积为加和之后怎么做

直接对于集合中的数构建生成函数

所要求的就是这个生成函数的$ n$次幂的所有模$ m$为$ c$的项的系数的和

用快速幂优化这个生成函数的$ n$次幂

每次乘法之后立刻把$ [m,2m)$的系数加回$[0,m)$

这样可以保证每时每刻生成函数的长度不超过$ m$

就可以直接$ NTT$优化这个过程了

时间复杂度为$ O(m log m log n)$

 

然后考虑乘积的情况

我们知道$ x^ax^b=x^{a+b}$

尝试把每个数改成某个底数的若干次方

由于$ m$是质数一定存在原根

原根有性质是它的$[0,phi(m))$在模$ m$意义下互不相同

这样就可以直接把每个集合中的数改成$ m$的原根的若干次方就好了

然后就是加和情况的做法

复杂度不变

注意可能要特判原集合中存在$ 0$的情况


 $ my \ code$

#include
#include
#include
#include
#include
#include
#include
#include
#define p 1004535809#define rt register int#define ll long longusing namespace std;inline ll read(){ ll x = 0; char zf = 1; char ch = getchar(); while (ch != '-' && !isdigit(ch)) ch = getchar(); if (ch == '-') zf = -1, ch = getchar(); while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar(); return x * zf;}void write(ll y){ if(y<0)putchar('-'),y=-y;if(y>9)write(y/10);putchar(y%10+48);}void writeln(const ll y){write(y);putchar('\n');}int i,j,k,m,n,x,y,z,cnt,c,yg;int a[100010],val[8555];namespace NTT{ int ksm(int x,int y){ int ans=1; for(rt i=y;i;i>>=1,x=1ll*x*x%p)if(i&1)ans=1ll*x*ans%p; return ans; } vector
R; void NTT(int n,vector
&A,int fla){ A.resize(n); for(rt i=0;i
R[i])swap(A[i],A[R[i]]); for(rt i=1;i
<<=1){ int w=ksm(3,(p-1)/2/i); for(rt j=0;j
<<1){ int K=1; for(rt k=0;k
&A){ NTT(n,A,1); for(rt i=0;i
&A,int y,int pl){ int lim=1; while(lim<=n*2+2)lim<<=1; R.resize(lim);A.resize(lim); for(rt i=1;i
>1]>>1)|((i&1)*(lim>>1)); vector
ans;ans.resize(lim); ans[0]=1; for(rt i=y;i;i>>=1,mul(n,lim,A))if(i&1){ NTT(lim,ans,1);NTT(lim,A,1); for(rt j=0;j
A,B;using namespace NTT;int main(){ n=read();m=read();c=read();k=read(); A.resize(m+1); for(rt i=2;i<=m;i++){ for(rt j=1,k=i;j

 

转载于:https://www.cnblogs.com/DreamlessDreams/p/10036133.html

你可能感兴趣的文章
在wdos系统下搭建postfix以及pop邮件收发服务器
查看>>
linux开机自动启动程序
查看>>
hive show current roles问题
查看>>
支付宝担保交易接口
查看>>
Queue1循环队列
查看>>
深入浅出三剑客之sed必杀技一例
查看>>
django sitemap设置为https
查看>>
我的友情链接
查看>>
关于Flag 老是忘掉的东西
查看>>
理解__name__和__main_
查看>>
python虚拟开发环境搭建
查看>>
微信内部浏览器打开网页时提示外部浏览器打开遮罩升级版
查看>>
Go语言类型的本质
查看>>
界面主窗体,子窗体的InitializeComponent(构造函数)、Load事件执行顺序
查看>>
java导入导出Excel数据的要点记录
查看>>
汇编2——完整的例子集合
查看>>
TP缓存设计方案解析
查看>>
APIO2010 特别行动队
查看>>
Javascript语言精粹之Array常用方法分析
查看>>
HDU Problem 1159 Common Subsequence 【LCS】
查看>>