SDOI2017遗忘的集合
题面链接
题外话
为了这道题我敲了\(MTT\)、多项式求逆、多项式\(ln\)等模板,搞了将近一天。
sol
最近懒得写题解啊,随便搞搞吧。
看到这个就是生成函数套上去。
\]
\]
\]
常见莫比乌斯套路,令\(T=ij\),交换枚举顺序。
\]
令\(G(x)=lnF(x)\),于是我们得到了一个奇怪的生成函数,\(G(x)\)的每一项就是\(\sum_{i|T}a_i\times\frac iT\)
可以莫比乌斯反演,也可以调和级数暴力减。
感谢Cyhlnj和巨sy
关于$$\ln(1-xi)=-\sum_{j=1}{\infty}\frac{x^{ij}}{j}$$洛谷上有人说是泰勒展开?害我证了好久没证出来。
也许是我太弱了,但我不敢苟同,反正我没看出来泰勒展开怎么搞,如果有人证出来了欢迎留言。
蒯\(zsy\)的博真舒服。
\]
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define gt getchar()
#define ll long long
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
inline int in()
{
int k=0;char ch=gt;
while(ch<'-')ch=gt;
while(ch>'-')k=k*10+ch-'0',ch=gt;
return k;
}
const int N=6e5+5;
const double PI=acos(-1);
int a[N],b[N],c[N],YL;
inline int MO(const int &a){return a>=YL?a-YL:a;}
inline int ksm(int a,int k){int r=1;while(k){if(k&1)r=1ll*r*a%YL;a=1ll*a*a%YL,k>>=1;}return r;}
int rev[N],Inv[N];
struct E
{
double x,y;
E(){}
E(double a,double b):x(a),y(b){}
E operator=(const int &a){x=a,y=0;return *this;}
E conj(){return E(x,-y);}
}omg[N];
E operator+(const E &a,const E &b){return E(a.x+b.x,a.y+b.y);}
E operator-(const E &a,const E &b){return E(a.x-b.x,a.y-b.y);}
E operator*(const E &a,const E &b){return E(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);}
inline void fft(E *a,int len)
{
for(int i=0;i<len;++i)if(i<rev[i])std::swap(a[i],a[rev[i]]);
for(int st=2,m=1;st<=len;st<<=1,m<<=1)
for(E *p=a,x,y;p!=a+len;p+=st)
for(int k=0;k<m;++k)
x=p[k],y=omg[len/m*k]*p[k+m],p[k]=x+y,p[k+m]=x-y;
}
inline void mul(int *A,int *B,int *C,int len)
{
int len2=len;len<<=1;int qwq=0;while((1<<qwq)<len)++qwq;--qwq;
for(int i=0;i<len;++i)rev[i]=(rev[i>>1]>>1)|((i&1)<<qwq);
for(int i=0;i<len;++i)omg[i]=E(cos(PI*i/len),sin(PI*i/len));
for(int i=0;i<len;++i)A[i]=MO(A[i]+YL),B[i]=MO(B[i]+YL);
static E mul_a[N],mul_b[N],dfta[N],dftb[N],dftc[N],dftd[N];
for(int i=0;i<len2;++i)mul_a[i]=E(A[i]&32767,A[i]>>15);
for(int i=0;i<len2;++i)mul_b[i]=E(B[i]&32767,B[i]>>15);
for(int i=len2;i<len;++i)mul_a[i]=mul_b[i]=E(0,0);
fft(mul_a,len),fft(mul_b,len);
for(int i=0;i<len;++i)
{
int j=(len-i)&(len-1);E da,db,dc,dd;
da=(mul_a[i]+mul_a[j].conj())*E( 0.5,0);
db=(mul_a[i]-mul_a[j].conj())*E(0,-0.5);
dc=(mul_b[i]+mul_b[j].conj())*E( 0.5,0);
dd=(mul_b[i]-mul_b[j].conj())*E(0,-0.5);
dfta[j]=da*dc,dftb[j]=da*dd,dftc[j]=db*dc,dftd[j]=db*dd;
}
for(int i=0;i<len;++i)mul_a[i]=dfta[i]+dftb[i]*E(0,1);
for(int i=0;i<len;++i)mul_b[i]=dftc[i]+dftd[i]*E(0,1);
fft(mul_a,len),fft(mul_b,len);
for(int i=0;i<len;++i)
{
int da=(ll)(mul_a[i].x/len+0.5)%YL;
int db=(ll)(mul_a[i].y/len+0.5)%YL;
int dc=(ll)(mul_b[i].x/len+0.5)%YL;
int dd=(ll)(mul_b[i].y/len+0.5)%YL;
C[i]=(da+((ll)(db+dc)<<15)+((ll)dd<<30))%YL;
}
}
void get_inv(int *a,int *b,int len)
{
if(len==1){b[0]=ksm(a[0],YL-2);return;}
static int tmp[N];get_inv(a,b,len>>1);mul(a,b,tmp,len);
for(int i=0;i<len;++i)tmp[i]=YL-tmp[i];tmp[0]+=2;mul(tmp,b,b,len);
}
void get_ln(int *a,int *b,int len)
{
static int d[N],inv[N];
for(int i=1;i<len;++i)d[i-1]=1ll*i*a[i]%YL;
get_inv(a,inv,len);mul(d,inv,b,len);
for(int i=len-1;i;--i)b[i]=1ll*b[i-1]*ksm(i,YL-2)%YL;b[0]=0;
}
int main()
{
int n=in();YL=in();int len=1,ans=0;while(len<=n)len<<=1;
for(int i=1;i<=n;++i)a[i]=in();a[0]=1;get_ln(a,a,len);
for(int i=1;i<=n;++i)a[i]=1ll*a[i]*i%YL;
for(int i=1;i<=n;++i)
for(int j=i<<1;j<=n;j+=i)
a[j]=MO(a[j]-a[i]+YL);
for(int i=1;i<=n;++i)if(a[i])++ans;printf("%d\n",ans);
for(int i=1;i<=n;++i)if(a[i])printf("%d ",i);puts("");
return 0;
}
SDOI2017遗忘的集合的更多相关文章
- [SDOI2017]遗忘的集合
[SDOI2017]遗忘的集合 综合了很多套路的题 一看就是完全背包 生成函数! 转化为连乘积形式 Pi....=F 求Ln! 降次才可以解方程 发现方程是: f[i]=∑t|i : bool(t)* ...
- [LOJ2271] [SDOI2017] 遗忘的集合
题目链接 LOJ:https://loj.ac/problem/2271 洛谷:https://www.luogu.org/problemnew/show/P3784 BZOJ太伤身体死活卡不过还是算 ...
- 洛谷P3784 [SDOI2017]遗忘的集合(生成函数)
题面 传送门 题解 生成函数这厮到底还有什么是办不到的-- 首先对于一个数\(i\),如果存在的话可以取无限多次,那么它的生成函数为\[\sum_{j=0}^{\infty}x^{ij}={1\ove ...
- [题解] LuoguP3784 [SDOI2017]遗忘的集合
要mtt的题都是...... 多补了几项就被卡了一整页......果然还是太菜了...... 不说了......来看100分的做法吧...... 如果做过付公主的背包,前面几步应该不难想,所以我们再来 ...
- [BZOJ4913][SDOI2017]遗忘的集合
题解: 首先先弄出$f(x)$的生成函数$$f(x)=\prod_{i=1}^{n} {{(\frac{1}{1-x^i})}}^{a[i]}$$因为$f(x)$已知,我们考虑利用这个式子取推出$a[ ...
- P3784 [SDOI2017]遗忘的集合
非常神仙的一道题! 题意:给出某n个数字跑完全背包m容量的dp数组,求满足要求的字典序最小的n个元素,不知道n是多少. 首先考虑付公主的背包这个题. 对dp数组求一个ln,设它为F. 已知 e^(G1 ...
- 洛谷 3784(bzoj 4913) [SDOI2017]遗忘的集合——多项式求ln+MTT
题目:https://www.luogu.org/problemnew/show/P3784 https://www.lydsy.com/JudgeOnline/problem.php?id=4913 ...
- BZOJ 4913 [Sdoi2017] 遗忘的集合
骂了隔壁的 BZOJ垃圾评测机 我他妈卡了两页的常数了 我们机房的电脑跑的都比BZOJ快
- 【SDOI2017】遗忘的集合
题目描述 好神仙啊,我还真的以为这是个构造题,结果是有唯一解的. 设答案为多项式\(a,a_i\in\{0,1\}\). 则: \[ f(x)=\Pi (\frac{1}{1-x^i})^{a_i} ...
随机推荐
- Installshield相关的后续操作<一>图解
1.XML文件读取 选择需要读取XML文件 2.SQL数据库的安装 这里选择的文件是数据库脚本.如果脚本没有创建数据库的语句,还需手动输入. 3.自定义界面Dialogs 下一步: 上面红色框框里面是 ...
- 企业上云这四大要点,你 get 了吗?
本文由 Platform9(一家专注于云计算.专有云.混合云.OpenStack 以及容器技术的北美初创公司)技术产品营销经理 Akshai Parthasarathy 撰写,描述了企业在向云基础设施 ...
- Linux加密到K8S中
文件名字 test.conf 加密: base64 --wrap=0 aaa.conf 把得到的密钥填入配置文件当中即可
- IOS statusBarStyle 设置
在项目info.plist文件中有 View controller-based status bar appearance 属性. 当设置为NO时 通过 [UIApplication sharedAp ...
- 升级salt导致进程kill问题记录
重启salt-minion导致由salt启动的进程kill问题排查 作者:耀耀 blog:https://www.liuyao.me 环境 服务器系统为centos6及centos7 服务器服务进程都 ...
- XSS攻击防御篇
前言 上篇文章中提到了 XSS 攻击,而且,也从几个方面介绍了 XSS 攻击带来的严重影响.那么,这篇文章中,主要是针对 XSS 攻击做一个基本的防御,看看可以通过几种方式来修复这个特别常见的安全 ...
- Python更新库
查看系统里过期的python库,可以用pip命令 [root@vnode33 sim-enb-sgi]# pip list #列出所有安装的库 Package Version ------------ ...
- iOS学习资源搜集
swift 2.0 新的开始 iOS7初学者入门 斯坦福大学公开课:iOS 8开发 苹果官方开发 中文 iOS/Mac 开发博客列表 git
- Sprint会议2
昨天:准备查找安卓APP开发的有关资料,安装有关软件 今天:自己制作一个安卓小程序,熟悉一下操作 遇到问题:安装遇到问题,环境配置出现问题
- wcf的DataContractAttribute与DataMenmberAttribute
文章:序列化和反序列化的几种方式(DataContractSerializer)(二) 介绍了序列化控制细节.哪些字段可以序列化,序列化后这些字段的名字.