P3784-[SDOI2017]遗忘的集合【多项式ln,MTT,莫比乌斯反演】

正题

题目链接:https://www.luogu.com.cn/problem/P3784


题目大意

你若干个在[1,n][1,n][1,n]的不同数字组成序列aaa

记录f(x)f(x)f(x)表示将xxx无序拆分成aaa中数字的和的方案数(一个数字可以使用多次)。

现在给出所有的f(x)%p(x∈[1,n])f(x)\%p\ (x\in[1,n])f(x)%p (x[1,n]),要求构造一组字典序最小的aaa满足这个条件。

n≤218,p∈[106,230)∩Prin\leq 2^{18},p\in[10^6,2^{30})\cap Prin218,p[106,230)Pri


解题思路

先考虑给出aaa怎么求fff,考虑使用生成函数,对于一个数字aaa可以表示成11−xa\frac{1}{1-x^{a}}1xa1
F(x)=∑i=0nf(i)xi=∏i=1n11−xaiF(x)=\sum_{i=0}^nf(i)x^i=\prod_{i=1}^n\frac{1}{1-x^{a_i}}F(x)=i=0nf(i)xi=i=1n1xai1
ln⁡F(x)=∑i=1nln⁡11−xai\ln F(x)=\sum_{i=1}^n\ln\frac{1}{1-x^{a_i}}lnF(x)=i=1nln1xai1
x(ln⁡F(x))′=∑i=1naixai1−xaix(\ \ln F(x)\ )'=\sum_{i=1}^n\frac{a_ix^{a_i}}{1-x^{a_i}}x( lnF(x) )=i=1n1xaiaixai
x(ln⁡F(x))′=∑i=1n∑j=1∞aixijx(\ \ln F(x)\ )'=\sum_{i=1}^n\sum_{j=1}^{\infty}a_ix^{ij}x( lnF(x) )=i=1nj=1aixij
如果我们求出x(ln⁡F(x))′x(\ \ln F(x)\ )'x( lnF(x) ),就可以莫反得到每一个aia_iai是否有了。

因为模数很丑,所以要用任意模数。

时间复杂度:O(nlog⁡n)O(n\log n)O(nlogn)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
const ll N=1<<20,T=1<<15;
const double Pi=acos(-1);
struct complex{double x,y;complex(double xx=0,double yy=0){x=xx;y=yy;return;}
}A[N],B[N],C[N],D[N],E[N],J[N],I[N],w[N];
struct Poly{ll a[N],n;
}F,G,t1;
ll n,P,cnt,pri[N/10],r[N],g[N],f[N],mu[N];
bool v[N];
complex operator+(const complex &x,const complex &y)
{return complex(x.x+y.x,x.y+y.y);}
complex operator-(const complex &x,const complex &y)
{return complex(x.x-y.x,x.y-y.y);}
complex operator*(const complex &x,const complex &y)
{return complex(x.x*y.x-x.y*y.y,x.x*y.y+x.y*y.x);}
ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%P;x=x*x%P;b>>=1;}return ans;
}
void FFT(complex *f,ll n,ll op){for(ll i=0;i<n;i++)if(i<r[i])swap(f[i],f[r[i]]);for(ll p=2;p<=n;p<<=1){ll len=p>>1;for(ll k=0;k<n;k+=p)for(ll i=k;i<k+len;i++){complex tmp=w[n/len*(i-k)];if(op==-1)tmp.y=-tmp.y;complex tt=f[i+len]*tmp;f[i+len]=f[i]-tt;f[i]=f[i]+tt;}}if(op==-1){for(ll i=0;i<n;i++)f[i]=complex(f[i].x/n+0.5);}return;
}
void Mul(Poly &F,Poly &G,Poly &H){ll l=1;while(l<F.n+G.n-1)l<<=1;for(ll i=0;i<l;i++)r[i]=r[i>>1]>>1|((i&1)?(l>>1):0);for(ll k=1;k<l;k<<=1)for(ll i=0;i<k;i++)w[l/k*i]=complex(cos(Pi/k*i),sin(Pi/k*i));for(ll i=0;i<F.n;i++)A[i]=complex(F.a[i]/T,0),B[i]=complex(F.a[i]%T,0);for(ll i=0;i<G.n;i++)C[i]=complex(G.a[i]/T,0),D[i]=complex(G.a[i]%T,0);for(ll i=F.n;i<l;i++)A[i]=B[i]=complex(0,0);for(ll i=G.n;i<l;i++)C[i]=D[i]=complex(0,0);for(ll i=0;i<l;i++)E[i]=J[i]=I[i]=complex(0,0);FFT(A,l,1);FFT(B,l,1);FFT(C,l,1);FFT(D,l,1);for(ll i=0;i<l;i++){E[i]=A[i]*C[i];J[i]=A[i]*D[i]+C[i]*B[i];I[i]=B[i]*D[i];}FFT(E,l,-1);FFT(J,l,-1);FFT(I,l,-1);for(ll i=0;i<l;i++){H.a[i]=(ll)E[i].x*T%P*T%P;(H.a[i]+=(ll)J[i].x*T%P)%=P;(H.a[i]+=(ll)I[i].x)%=P;}H.n=F.n+G.n-1;return;
}
void CalcInv(ll n,Poly &F,Poly &G){if(n==1){G.a[0]=power(F.a[0],P-2);G.n=1;return;}CalcInv(n>>1,F,G);Mul(G,G,t1);t1.n=n;ll pn=F.n;F.n=n;Mul(t1,F,t1);t1.n=n;F.n=pn;for(ll i=0;i<G.n;i++)G.a[i]=(2ll*G.a[i]-t1.a[i]+P)%P;for(ll i=G.n;i<n;i++)G.a[i]=P-t1.a[i];G.n=n;return;
}
void GetInv(Poly &F,Poly &G){ll l=1;while(l<F.n)l<<=1;CalcInv(l,F,G);G.n=F.n;return;
}
void GetD(Poly &F){for(ll i=0;i<F.n-1;i++)F.a[i]=F.a[i+1]*(i+1)%P;F.n--;return;
}
void GetJ(Poly &F){for(ll i=F.n;i>0;i--)F.a[i]=F.a[i-1]*power(i,P-2)%P;F.a[0]=0;F.n++;return;
}
void GetLn(Poly &F){GetInv(F,G);GetD(F);Mul(F,G,F);GetJ(F);return;
}
void Prime(ll n){mu[1]=1;for(ll i=2;i<=n;i++){if(!v[i])pri[++cnt]=i,mu[i]=-1;for(ll j=1;j<=cnt&&i*pri[j]<=n;j++){v[i*pri[j]]=1;if(i%pri[j]==0)break;mu[i*pri[j]]=-mu[i];}}return;
}
signed main()
{scanf("%lld%lld",&n,&P);for(ll i=1;i<=n;i++)scanf("%lld",&F.a[i]);F.n=n+1;F.a[0]=1;GetLn(F);GetD(F);Prime(n);for(ll i=1;i<=n;i++)f[i]=F.a[i-1];for(ll i=1;i<=n;i++)for(ll j=i;j<=n;j+=i)(g[j]+=f[i]*mu[j/i]+P)%=P;ll ans=0;for(ll i=1;i<=n;i++)if(g[i])ans++;printf("%lld\n",ans);for(ll i=1;i<=n;i++)if(g[i])printf("%lld ",i);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317438.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Matrix Problem

Matrix Problem 题意&#xff1a; 给你一个n * m的二维数据c&#xff0c;c的每个元素值为0或1 现在要求你构造同样大小的数组a和b&#xff0c;要求c[i][j] 1’的话&#xff0c;a[i][j] b[i][j] ‘1’&#xff0c;如果c[i][j] ‘0’.a[i][j]!b[i][j]&#xff0c;且a和b中的1…

P3545HUR-Warehouse StoreP4053建筑抢修(反悔贪心、堆)

解析 两道很像的题 不能说相似&#xff0c;只能说是一模一样 感觉有火车载客的影子 想到开个堆来维护 在供不应求时弹出要求最高的即可 T1还得输出方案针麻烦 代码 你会发现几乎一毛一样 T1 #include<bits/stdc.h>const int N3e5100; const int M2e3100; const int …

ASP.NET Core 实战:基于 Jwt Token 的权限控制全揭露

一、前言在涉及到后端项目的开发中&#xff0c;如何实现对于用户权限的管控是需要我们首先考虑的&#xff0c;在实际开发过程中&#xff0c;我们可能会运用一些已经成熟的解决方案帮助我们实现这一功能&#xff0c;而在 Grapefruit.VuCore 这个项目中&#xff0c;我将使用 Jwt …

AT2293-[AGC009D] Uninity【贪心,状压】

正题 题目链接:https://www.luogu.com.cn/problem/AT2293 题目大意 给出一棵树&#xff0c;求它一棵点分树的最小深度。 1≤n≤1051\leq n\leq 10^51≤n≤105 解题思路 点分树的做法是直接找重心&#xff0c;但是两个重心我们很难确定找哪个&#xff0c;所以这个方法行不通。…

[2021-06-19] 提高组新手副本Ⅱ(联网,欧几里得,分解树,开关灯)

文章目录考试心路历程联网titlesolutioncode欧几里得titlesolutioncode分解树titlesolutioncode开关灯titlesolutioncode考试心路历程 佛了佛了&#xff0c;caocaocaocaocaocao 人直接炸嗨升天 并查集直接送走200200200分&#xff01;&#xff01;&#xff01;我屮艸芔茻 T1二…

模板:扫描线

那看似平凡的面积&#xff0c;是多少条线的织物啊 前言 突然发现自己之前没发过扫描线的模板 可能是因为之前的实现太差了 这次感觉实现的还是很不错的&#xff0c; 虽然常数比较大&#xff0c;但是好写啊&#xff01; 原来扫描线也是可以1A的 线段树上利用zld讲解的维护最小…

P4887-[模板]莫队二次离线(第十四分块(前体))

正题 题目链接:https://www.luogu.com.cn/problem/P4887 题目大意 给出一个长度为nnn的序列aaa。mmm次询问[l,r][l,r][l,r]求有多少个l≤i<j≤rl\leq i< j\leq rl≤i<j≤r满足aixoraja_i\ xor\ a_jai​ xor aj​二进制下恰好有kkk个111。 1≤n,q≤105,0≤ai,k<21…

在.NET Core中设计自己的服务宿主(Service Hosting)框架

很多时候我们都会有设计一个后台服务的需求&#xff0c;比如&#xff0c;传统的Windows Service&#xff0c;或者Linux下的守护进程。这类应用的一个共同特点就是后台运行&#xff0c;并且不占用控制台界面。通常情况下&#xff0c;后台服务在提供服务时&#xff0c;会通过日志…

CF1131 G. Most Dangerous Shark(DP+单调栈优化)

文章目录problemsolutioncodeproblem solution dpi:dp_i:dpi​: 前iii个多米诺骨牌全都倒下的最小花费 li,ril_i,r_ili​,ri​分别表示第iii个多米诺骨牌倒下时所能波及到的最左/右位置 往左倒&#xff0c;则[li,i)[l_i,i)[li​,i)内的牌都可以选择性地先推倒 dpimin⁡{dpjcos…

Cat Virus

Cat Virus 题意&#xff1a; 让你构造一颗树&#xff0c;要求如果一个点为黑&#xff0c;其子树全为黑&#xff0c;白点任意&#xff0c;现在让你构造一棵树&#xff0c;使其染色方案数为K&#xff0c;节点尽可能少 题解&#xff1a; 首先画出k<9的全部情况&#xff0c;并…

NOIP2021:游记

前言 似乎前一秒还在为接下来的考试紧张&#xff0c;下一秒就已经走出了考场 恍惚之间突然意识到&#xff0c;有些日子&#xff0c;可能真的变成了过往 停止emo 感谢FFC&#xff0c;感谢大连&#xff0c;使这次考试顺利进行 主要的问题是T4的暴力 写的时候只有不到一个点&…

微软发布XAML Studio工具:快速构建UWP XAML原型

IT之家1月30日消息 微软车库的最新项目XAML Studio已经在Windows 10应用商店上架&#xff0c;将帮助开发人员快速构建UWP XAML原型&#xff0c;以后可以轻松地将其复制到Visual Studio中。它将允许开发人员实时预览他们的XAML代码&#xff0c;并与结果进行交互&#xff0c;就像…

P5113-Sabbat of the witch【分块,基数排序】

正题 题目链接:https://www.luogu.com.cn/problem/P5113 题目大意 一个长度为nnn的序列aaa&#xff0c;mmm次要求支持以下操作 将区间[l,r][l,r][l,r]都变为xxx。询问区间[l,r][l,r][l,r]的和。将第xxx次操作111撤销。 强制在线 1≤n,m≤105,1≤ai,x≤1091\leq n,m\leq 10^…

C. The Sports Festival

C. The Sports Festival 题意&#xff1a; n个数&#xff0c;依次将所有数加入到区间内&#xff0c;每次得到一个k&#xff0c;k等于当前区间的最大值减最小值&#xff0c; 求所有k的和的最小值 题解&#xff1a; 一开始就没往dp那方面想&#xff0c;自己在dp这方面的理解还…

模板:点分治点分树

文章目录前言点分治背景解析代码点分树情境代码thanks for reading!所谓点分治&#xff0c;就是把所有的点分开来治 &#xff08;逃&#xff09; &#xff08;应广大观众要求&#xff0c;开篇废话改回原风格qwq&#xff09; 前言 很神奇的算法。 没有引入任何新的知识&#x…

.NET Core 3 Preview 2发布,C#8更强大的模式匹配

.NET Core 3 Preview 2 发布了&#xff0c;此版本主要带来了 C# 8 相关的新功能&#xff0c;C# 8 Preview 2 是 .NET Core 3 SDK 的一部分。C# 8 中使用模式进行更多操作&#xff0c;主要特性包括&#xff1a;using 声明改变需要缩进代码的方式&#xff0c;现在可以编写以下代码…

Loj#2474-「2018 集训队互测 Day 3」北校门外的未来【LCT】

正题 题目链接:https://loj.ac/p/2474 题目大意 开始有一个只有点111的图&#xff0c;一个点xxx能走到点yyy当且仅当路径(x,y)(x,y)(x,y)之间&#xff08;不包括x,yx,yx,y&#xff09;不存在编号比xxx或yyy要大的节点。有mmm次操作&#xff1a; 新建一个编号为yyy的节点和xx…

CF407 E. k-d-sequence(线段树+单调栈)

文章目录CF407 E. k-d-sequenceproblemsolutioncodeCF407 E. k-d-sequence problem solution special case&#xff0c;d0d0d0&#xff0c;相当于寻找最长的一段数字相同的区间 other case&#xff0c;如果要满足公差为ddd等差序列 区间内每个数在模ddd意义下同余每个数互不…

D. Binary Literature

D. Binary Literature 题意&#xff1a; 给三个长度为2 * n的01串&#xff0c;让你构造一个长度小于3 * n的字符串&#xff0c;使得这个串至少包含两个01串 题解&#xff1a; 很巧妙的构造题 三个指针分别指向三个串&#xff0c;因为是01串&#xff0c;所以一定存在两个字符…

安逸:鼠绘《诗与远方》

【作品名称】《诗与远方》【作者介绍】徐安&#xff08;笔名安逸&#xff0c;常州&#xff09;&#xff0c;PPT专家&#xff0c;鼠绘专家。平面设计专业&#xff0c;6年PPT设计经验&#xff1b;历届江苏省PPT制作大赛一等奖获得者&#xff0c;PA口袋动画重要合作人。PPT动画制作…