题面链接

咕咕咕

题外话

为了这道题我敲了\(MTT\)、多项式求逆、多项式\(ln\)等模板,搞了将近一天。

sol

最近懒得写题解啊,随便搞搞吧。

看到这个就是生成函数套上去。

\[F(x)=\prod_{i=1}^{n}(\frac{1}{1-x^i})^{a_i}
\]

\[-\ln F(x)=\sum_{i=1}^na_i\ln(1-x^i)
\]

\[-\ln F(x)=-\sum_{i=1}^na_i\sum_{j=1}^{\infty}\frac{x^{ij}}{j}
\]

常见莫比乌斯套路,令\(T=ij\),交换枚举顺序。

\[\ln F(x)=\sum_{T=1}^{\infty}x^T\sum_{i|T}a_i\times \frac iT
\]

令\(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\)的博真舒服。

\[\ln F(x)=G(x)\\\frac{F'(x)}{F(x)}=G'(x)\\\frac{-ix^{i-1}}{1-x^i}=G'(x)\\-\sum_{j=0}^{\infty} ix^{i-1+ij}=G'(x)\\-\sum_{j=0}^{\infty}\frac{ix^{i+ij}}{i+ij}=G(x)\\-\sum_{j=1}^{\infty}\frac{x^{ij}}{j}=G(x)
\]

  1. #include<cmath>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #define gt getchar()
  6. #define ll long long
  7. #define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
  8. inline int in()
  9. {
  10. int k=0;char ch=gt;
  11. while(ch<'-')ch=gt;
  12. while(ch>'-')k=k*10+ch-'0',ch=gt;
  13. return k;
  14. }
  15. const int N=6e5+5;
  16. const double PI=acos(-1);
  17. int a[N],b[N],c[N],YL;
  18. inline int MO(const int &a){return a>=YL?a-YL:a;}
  19. 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;}
  20. int rev[N],Inv[N];
  21. struct E
  22. {
  23. double x,y;
  24. E(){}
  25. E(double a,double b):x(a),y(b){}
  26. E operator=(const int &a){x=a,y=0;return *this;}
  27. E conj(){return E(x,-y);}
  28. }omg[N];
  29. E operator+(const E &a,const E &b){return E(a.x+b.x,a.y+b.y);}
  30. E operator-(const E &a,const E &b){return E(a.x-b.x,a.y-b.y);}
  31. 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);}
  32. inline void fft(E *a,int len)
  33. {
  34. for(int i=0;i<len;++i)if(i<rev[i])std::swap(a[i],a[rev[i]]);
  35. for(int st=2,m=1;st<=len;st<<=1,m<<=1)
  36. for(E *p=a,x,y;p!=a+len;p+=st)
  37. for(int k=0;k<m;++k)
  38. x=p[k],y=omg[len/m*k]*p[k+m],p[k]=x+y,p[k+m]=x-y;
  39. }
  40. inline void mul(int *A,int *B,int *C,int len)
  41. {
  42. int len2=len;len<<=1;int qwq=0;while((1<<qwq)<len)++qwq;--qwq;
  43. for(int i=0;i<len;++i)rev[i]=(rev[i>>1]>>1)|((i&1)<<qwq);
  44. for(int i=0;i<len;++i)omg[i]=E(cos(PI*i/len),sin(PI*i/len));
  45. for(int i=0;i<len;++i)A[i]=MO(A[i]+YL),B[i]=MO(B[i]+YL);
  46. static E mul_a[N],mul_b[N],dfta[N],dftb[N],dftc[N],dftd[N];
  47. for(int i=0;i<len2;++i)mul_a[i]=E(A[i]&32767,A[i]>>15);
  48. for(int i=0;i<len2;++i)mul_b[i]=E(B[i]&32767,B[i]>>15);
  49. for(int i=len2;i<len;++i)mul_a[i]=mul_b[i]=E(0,0);
  50. fft(mul_a,len),fft(mul_b,len);
  51. for(int i=0;i<len;++i)
  52. {
  53. int j=(len-i)&(len-1);E da,db,dc,dd;
  54. da=(mul_a[i]+mul_a[j].conj())*E( 0.5,0);
  55. db=(mul_a[i]-mul_a[j].conj())*E(0,-0.5);
  56. dc=(mul_b[i]+mul_b[j].conj())*E( 0.5,0);
  57. dd=(mul_b[i]-mul_b[j].conj())*E(0,-0.5);
  58. dfta[j]=da*dc,dftb[j]=da*dd,dftc[j]=db*dc,dftd[j]=db*dd;
  59. }
  60. for(int i=0;i<len;++i)mul_a[i]=dfta[i]+dftb[i]*E(0,1);
  61. for(int i=0;i<len;++i)mul_b[i]=dftc[i]+dftd[i]*E(0,1);
  62. fft(mul_a,len),fft(mul_b,len);
  63. for(int i=0;i<len;++i)
  64. {
  65. int da=(ll)(mul_a[i].x/len+0.5)%YL;
  66. int db=(ll)(mul_a[i].y/len+0.5)%YL;
  67. int dc=(ll)(mul_b[i].x/len+0.5)%YL;
  68. int dd=(ll)(mul_b[i].y/len+0.5)%YL;
  69. C[i]=(da+((ll)(db+dc)<<15)+((ll)dd<<30))%YL;
  70. }
  71. }
  72. void get_inv(int *a,int *b,int len)
  73. {
  74. if(len==1){b[0]=ksm(a[0],YL-2);return;}
  75. static int tmp[N];get_inv(a,b,len>>1);mul(a,b,tmp,len);
  76. for(int i=0;i<len;++i)tmp[i]=YL-tmp[i];tmp[0]+=2;mul(tmp,b,b,len);
  77. }
  78. void get_ln(int *a,int *b,int len)
  79. {
  80. static int d[N],inv[N];
  81. for(int i=1;i<len;++i)d[i-1]=1ll*i*a[i]%YL;
  82. get_inv(a,inv,len);mul(d,inv,b,len);
  83. for(int i=len-1;i;--i)b[i]=1ll*b[i-1]*ksm(i,YL-2)%YL;b[0]=0;
  84. }
  85. int main()
  86. {
  87. int n=in();YL=in();int len=1,ans=0;while(len<=n)len<<=1;
  88. for(int i=1;i<=n;++i)a[i]=in();a[0]=1;get_ln(a,a,len);
  89. for(int i=1;i<=n;++i)a[i]=1ll*a[i]*i%YL;
  90. for(int i=1;i<=n;++i)
  91. for(int j=i<<1;j<=n;j+=i)
  92. a[j]=MO(a[j]-a[i]+YL);
  93. for(int i=1;i<=n;++i)if(a[i])++ans;printf("%d\n",ans);
  94. for(int i=1;i<=n;++i)if(a[i])printf("%d ",i);puts("");
  95. return 0;
  96. }

SDOI2017遗忘的集合的更多相关文章

  1. [SDOI2017]遗忘的集合

    [SDOI2017]遗忘的集合 综合了很多套路的题 一看就是完全背包 生成函数! 转化为连乘积形式 Pi....=F 求Ln! 降次才可以解方程 发现方程是: f[i]=∑t|i : bool(t)* ...

  2. [LOJ2271] [SDOI2017] 遗忘的集合

    题目链接 LOJ:https://loj.ac/problem/2271 洛谷:https://www.luogu.org/problemnew/show/P3784 BZOJ太伤身体死活卡不过还是算 ...

  3. 洛谷P3784 [SDOI2017]遗忘的集合(生成函数)

    题面 传送门 题解 生成函数这厮到底还有什么是办不到的-- 首先对于一个数\(i\),如果存在的话可以取无限多次,那么它的生成函数为\[\sum_{j=0}^{\infty}x^{ij}={1\ove ...

  4. [题解] LuoguP3784 [SDOI2017]遗忘的集合

    要mtt的题都是...... 多补了几项就被卡了一整页......果然还是太菜了...... 不说了......来看100分的做法吧...... 如果做过付公主的背包,前面几步应该不难想,所以我们再来 ...

  5. [BZOJ4913][SDOI2017]遗忘的集合

    题解: 首先先弄出$f(x)$的生成函数$$f(x)=\prod_{i=1}^{n} {{(\frac{1}{1-x^i})}}^{a[i]}$$因为$f(x)$已知,我们考虑利用这个式子取推出$a[ ...

  6. P3784 [SDOI2017]遗忘的集合

    非常神仙的一道题! 题意:给出某n个数字跑完全背包m容量的dp数组,求满足要求的字典序最小的n个元素,不知道n是多少. 首先考虑付公主的背包这个题. 对dp数组求一个ln,设它为F. 已知 e^(G1 ...

  7. 洛谷 3784(bzoj 4913) [SDOI2017]遗忘的集合——多项式求ln+MTT

    题目:https://www.luogu.org/problemnew/show/P3784 https://www.lydsy.com/JudgeOnline/problem.php?id=4913 ...

  8. BZOJ 4913 [Sdoi2017] 遗忘的集合

    骂了隔壁的 BZOJ垃圾评测机 我他妈卡了两页的常数了 我们机房的电脑跑的都比BZOJ快

  9. 【SDOI2017】遗忘的集合

    题目描述 好神仙啊,我还真的以为这是个构造题,结果是有唯一解的. 设答案为多项式\(a,a_i\in\{0,1\}\). 则: \[ f(x)=\Pi (\frac{1}{1-x^i})^{a_i} ...

随机推荐

  1. Vue2.0原理-指令

    指令是 模板解析 的续章,本文会尝试从源码的角度来理解 指令 是如何被提取和应用的. 指令的提取 指令的提取过程是在parse阶段进行的,在 parseHTML 方法中,会解析字符串模板为如下的单个a ...

  2. TPO-22 C2 Revise a music history paper

    第 1 段 1.Listen to part of a conversation between a student and his music history professor. :听一段学生和音 ...

  3. krkr基础篇(一)

    krkr基础篇是我根据krkr的官方教程总结而来 推荐代替记事本的工具:editplus,点我下载 激活码:Vovan 3AG46-JJ48E-CEACC-8E6EW-ECUAW 一:创建新工程 1: ...

  4. 4. 为HelloWorld添加日志

    回顾 通过上篇内容,我们已经使用flask编写了我们的第一个接口或者说是html页面.我们可以看到,使用flask来编写接口/页面是十分简单的.那么接下来,我们丰富一下上面的例子. 需求 现在的需求来 ...

  5. Vuejs 使用 lib 库模式打包 umd 解决 NPM 包发布的问题

    由于升级了 v0.2 版 GearCase 使用打包工具从 parcel 更换成 vue-cli 3.x.因此打包后发布 NPM 包的方式与之前有很大的差异,这也导致了在发布完 GearCase v0 ...

  6. Python-opencv摄像头图像捕获

    实例一 (灰色调度) #!/usr/bin/env python # _*_ coding:utf-8 _*_ import cv2 as cv import numpy as np capture ...

  7. 微软职位内部推荐-Software Engineer II-Senior Software Engineer for Satori

    微软近期Open的职位: Title: Software Engineer II-Senior Software Engineer for Satori, STC Location: Beijing ...

  8. 【quickhybrid】Android端的项目实现

    前言 前文中就有提到,Hybrid模式的核心就是在原生,而本文就以此项目的Android部分为例介绍Android部分的实现. 提示,由于各种各样的原因,本项目中的Android容器确保核心交互以及部 ...

  9. java第三次实验报告

    北京电子科技学院(BESTI) 实验报告 课程: Java程序设计 班级: 1352 姓名: 池彬宁 学号: 20135212 成绩: 指导教师: 娄嘉鹏 实验日期: 2015.6.3 实验密级: 无 ...

  10. Sprint会议3

    昨天:熟悉了一下软件操作,设计了图标. 今天:今天满课,没有做什么实质性的进展. 遇到问题:由于没干什么,也没遇到什么问题.