题解:

首先先弄出$f(x)$的生成函数
$$f(x)=\prod_{i=1}^{n} {{(\frac{1}{1-x^i})}}^{a[i]}$$
因为$f(x)$已知,我们考虑利用这个式子取推出$a[i]$
右边的乘法显然处理起来不方便,按照套路两边取对数
$$ln(f(x))=\sum_{i=1}^{n} {-a[i]*ln(1-x^i)}$$
然后看见$ln(1+x)$肯定是泰勒展开了,得到
$$ln(f(x))=\sum_{i=1}^{n} {-a[i]*\sum_{k=1}^{INF} {\frac{{(-1)}^{k-1}*{{{(-x^i)}^k}}}{k}}}$$
化简一下就是
$$ln(f(x))=\sum_{i=1}^{n} {a[i]*\sum_{k=1}^{INF} {\frac{{x^{ik}}}{k}}}$$
然后因为我们知道的$f(x)$的每一项,所以变成枚举x系数
令$T=ik$
$$ln(f(x))=\sum_{T=1}^{INF} {x^T \sum_{i|T}^{T}{\frac{i*a[i]}{T}}}$$
然后我们只需要从小到大枚举T,然后依旧算出每个$a[i]$并处理对之后的影响

常数太大只有50。。。不知道怎么卡

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define rint register int
  4. #define IL inline
  5. #define rep(i,h,t) for (int i=h;i<=t;i++)
  6. #define dep(i,t,h) for (int i=t;i>=h;i--)
  7. #define me(x) memset(x,0,sizeof(x))
  8. #define ll long long
  9. namespace IO{
  10. char ss[<<],*A=ss,*B=ss;
  11. IL char gc()
  12. {
  13. return A==B&&(B=(A=ss)+fread(ss,,<<,stdin),A==B)?EOF:*A++;
  14. }
  15. template<class T>void read(T &x)
  16. {
  17. rint f=,c; while (c=gc(),c<||c>) if (c=='-') f=-; x=(c^);
  18. while (c=gc(),c>&&c<) x=(x<<)+(x<<)+(c^); x*=f;
  19. }
  20. char sr[<<],z[]; int C1=-,Z;
  21. template<class T>void wer(T x)
  22. {
  23. if (x<) sr[++C1]='-',x=-x;
  24. while (z[++Z]=x%+,x/=);
  25. while (sr[++C1]=z[Z],--Z);
  26. }
  27. IL void wer1()
  28. {
  29. sr[++C1]=' ';
  30. }
  31. IL void wer2()
  32. {
  33. sr[++C1]='\n';
  34. }
  35. template<class T>IL void maxa(T &x,T y) { if (x<y) x=y;}
  36. template<class T>IL void mina(T &x,T y) { if (x>y) x=y;}
  37. template<class T>IL void MAX(T x,T y){ return x>y?x:y;}
  38. template<class T>IL void MIN(T x,T y){ return x<y?x:y;}
  39. };
  40. using namespace IO;
  41. const int N=3e5*;
  42. const double ee=1.0000000000;
  43. const double pi=acos(-1.0);
  44. struct cp{
  45. double a,b;
  46. cp operator +(const cp o) const
  47. {
  48. return (cp){o.a+a,o.b+b};
  49. }
  50. cp operator -(const cp o) const
  51. {
  52. return (cp){a-o.a,b-o.b};
  53. }
  54. cp operator *(const cp o) const
  55. {
  56. return (cp){a*o.a-b*o.b,b*o.a+a*o.b};
  57. }
  58. }a[N],b[N],w[N];
  59. int n,m,l,r[N],mo,mo2,mo3,x1[N],x2[N];
  60. int fsp(int x,int y)
  61. {
  62. ll now=;
  63. while (y)
  64. {
  65. if (y&) now=now*x%mo;
  66. y>>=; x=1ll*x*x%mo;
  67. }
  68. return now;
  69. }
  70. void fft_init()
  71. {
  72. l=; n=; while (n<=m) n<<=,l++;
  73. for (int i=;i<n;i++)
  74. {
  75. w[i]=(cp){cos(pi*i/n),sin(pi*i/n)};
  76. r[i]=(r[i/]/)|((i&)<<(l-));
  77. }
  78. }
  79. void fft_clear()
  80. {
  81. rep(i,,n-) a[i].a=a[i].b=b[i].a=b[i].b=;
  82. }
  83. void fft(cp *a,int o)
  84. {
  85. for (int i=;i<n;i++) if (i>r[i]) swap(a[i],a[r[i]]);
  86. for (int i=;i<n;i*=)
  87. for (int j=;j<n;j+=(i*))
  88. {
  89. cp *x1=a+j,*x2=a+i+j;
  90. for (int k=;k<i;k++,x1++,x2++)
  91. {
  92. cp W=w[n/i*k]; W.b*=o;
  93. cp x=*x1,y=(*x2)*W;
  94. *x1=x+y,*x2=x-y;
  95. }
  96. }
  97. if (o==-) rep(i,,n-) a[i].a/=n;
  98. }
  99. cp a1[N],a2[N],a3[N],b1[N],b2[N];
  100. void getcj(int *A,int *B,int len)
  101. {
  102. m=*len; fft_init();
  103. rep(i,,len-)
  104. {
  105. a1[i].a=A[i]/mo2,a2[i].a=A[i]%mo2;
  106. b1[i].a=B[i]/mo2,b2[i].a=B[i]%mo2;
  107. }
  108. fft(a1,); fft(a2,); fft(b1,); fft(b2,);
  109. rep(i,,n-)
  110. {
  111. a3[i]=a1[i]*b1[i];
  112. a1[i]=a1[i]*b2[i]+a2[i]*b1[i];
  113. b2[i]=a2[i]*b2[i];
  114. }
  115. fft(a3,-); fft(a1,-); fft(b2,-);
  116. rep(i,,len-)
  117. {
  118. B[i]=((ll)(a3[i].a+0.5)%mo*mo3+(ll)(a1[i].a+0.5)%mo*mo2+(ll)(b2[i].a+0.5))%mo;
  119. B[i]=(B[i]+mo)%mo;
  120. }
  121. rep(i,,n)
  122. {
  123. a1[i].a=a1[i].b=a2[i].a=a2[i].b=a3[i].a=a3[i].b=;
  124. b1[i].a=b1[i].b=b2[i].a=b2[i].b=;
  125. }
  126. }
  127. int C[N];
  128. IL void getinv(int *A,int *B,int len)
  129. {
  130. if (len==) {B[]=fsp(A[],mo-); return;}
  131. getinv(A,B,(len+)>>);
  132. rep(i,,len-) C[i]=A[i];
  133. getcj(B,C,len); getcj(B,C,len);
  134. rep(i,,len-) B[i]=((2ll*B[i]-C[i])%mo+mo)%mo;
  135. }
  136. IL void getdao(int *A,int *B,int len)
  137. {
  138. for (int i=;i<len-;i++)
  139. B[i]=1ll*A[i+]*(i+)%mo;
  140. B[len-]=;
  141. }
  142. IL void getjf(int *A,int *B,int len)
  143. {
  144. for (int i=;i<len;i++)
  145. B[i]=1ll*A[i-]*fsp(i,mo-)%mo;
  146. B[]=;
  147. }
  148. int C[N],D[N];
  149. IL void getln(int *A,int *B,int len)
  150. {
  151. getdao(A,C,len);
  152. getinv(A,D,len);
  153. getcj(C,D,len);
  154. getjf(D,B,len);
  155. }
  156. void getexp(int *A,int *B,int len)
  157. {
  158. if (len==) {B[]=; return;}
  159. getexp(A,B,(len+)>>);
  160. getln(B,C,len);
  161. rep(i,,len-) C[i]=((-C[i]+A[i])%mo+mo)%mo;
  162. C[]=(C[]+)%mo;
  163. getcj(C,B,len);
  164. }
  165. int main()
  166. {
  167. freopen("1.in","r",stdin);
  168. freopen("1.out","w",stdout);
  169. int n1;
  170. read(n1); read(mo); mo2=3e4; mo3=mo2*mo2;
  171. x1[]=;
  172. rep(i,,n1) read(x1[i]);
  173. getln(x1,x2,n1+);
  174. rep(i,,n1)
  175. {
  176. for (int j=;j*i<=n1;j++)
  177. x2[i*j]=(x2[i*j]-1ll*x2[i]*fsp(j,mo-))%mo;
  178. }
  179. int cnt=;
  180. rep(i,,n1) if (x2[i]) cnt++;
  181. wer(cnt); wer2();
  182. rep(i,,n1) if (x2[i]) wer(i),wer1();
  183. wer2();
  184. fwrite(sr,,C1+,stdout);
  185. return ;
  186. }

#updata 12.14

使用我优秀的常数的新模板他就过了

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define rint register int
  4. #define IL inline
  5. #define rep(i,h,t) for (int i=h;i<=t;i++)
  6. #define dep(i,t,h) for (int i=t;i>=h;i--)
  7. #define me(x) memset(x,0,sizeof(x))
  8. #define ll long long
  9. namespace IO{
  10. char ss[<<],*A=ss,*B=ss;
  11. IL char gc()
  12. {
  13. return A==B&&(B=(A=ss)+fread(ss,,<<,stdin),A==B)?EOF:*A++;
  14. }
  15. template<class T>void read(T &x)
  16. {
  17. rint f=,c; while (c=gc(),c<||c>) if (c=='-') f=-; x=(c^);
  18. while (c=gc(),c>&&c<) x=(x<<)+(x<<)+(c^); x*=f;
  19. }
  20. char sr[<<],z[]; int C1=-,Z;
  21. template<class T>void wer(T x)
  22. {
  23. if (x<) sr[++C1]='-',x=-x;
  24. while (z[++Z]=x%+,x/=);
  25. while (sr[++C1]=z[Z],--Z);
  26. }
  27. IL void wer1()
  28. {
  29. sr[++C1]=' ';
  30. }
  31. IL void wer2()
  32. {
  33. sr[++C1]='\n';
  34. }
  35. template<class T>IL void maxa(T &x,T y) { if (x<y) x=y;}
  36. template<class T>IL void mina(T &x,T y) { if (x>y) x=y;}
  37. template<class T>IL void MAX(T x,T y){ return x>y?x:y;}
  38. template<class T>IL void MIN(T x,T y){ return x<y?x:y;}
  39. };
  40. using namespace IO;
  41. const int N=3e5*;
  42. const double ee=1.0000000000;
  43. const double pi=acos(-1.0);
  44. struct cp{
  45. double a,b;
  46. cp operator +(const cp o) const
  47. {
  48. return (cp){o.a+a,o.b+b};
  49. }
  50. cp operator -(const cp o) const
  51. {
  52. return (cp){a-o.a,b-o.b};
  53. }
  54. cp operator *(const cp o) const
  55. {
  56. return (cp){a*o.a-b*o.b,b*o.a+a*o.b};
  57. }
  58. }a[N],b[N],c[N],d[N];
  59. int n,m,l,r[N],mo,x1[N],x2[N];
  60. IL int fsp(int x,int y)
  61. {
  62. ll now=;
  63. while (y)
  64. {
  65. if (y&) now=now*x%mo;
  66. x=1ll*x*x%mo;
  67. y>>=;
  68. }
  69. return now;
  70. }
  71. IL void clear()
  72. {
  73. for (int i=;i<=n;i++) a[i].a=a[i].b=b[i].a=b[i].b=c[i].a=c[i].b=d[i].a=d[i].b=;
  74. }
  75. cp *w[N],tmp[N*];
  76. int p;
  77. IL void init()
  78. {
  79. cp *now=tmp;
  80. for (int i=;i<=p;i<<=)
  81. {
  82. w[i]=now;
  83. for (int j=;j<i;j++) w[i][j]=(cp){cos(pi*j/i),sin(pi*j/i)};
  84. now+=i;
  85. }
  86. }
  87. IL void fft_init()
  88. {
  89. l=; for (n=;n<=m;n<<=) l++;
  90. for (int i=;i<n;i++) r[i]=(r[i/]/)|((i&)<<(l-));
  91. }
  92. void fft(cp *a,int o)
  93. {
  94. for (int i=;i<n;i++) if (i>r[i]) swap(a[i],a[r[i]]);
  95. for (int i=;i<n;i<<=)
  96. for (int j=;j<n;j+=(i*))
  97. {
  98. cp *x1=a+j,*x2=a+i+j,*W=w[i];
  99. for (int k=;k<i;k++,x1++,x2++,W++)
  100. {
  101. cp x=*x1,y=(cp){(*W).a,(*W).b*o}*(*x2);
  102. *x1=x+y,*x2=x-y;
  103. }
  104. }
  105. if (o==-) for(int i=;i<n;i++) a[i].a/=n;
  106. }
  107. IL void getcj(int *A,int *B,int len)
  108. {
  109. rep(i,,len)
  110. {
  111. A[i]=(A[i]+mo)%mo,B[i]=(B[i]+mo)%mo;
  112. }
  113. for (int i=;i<len;i++)
  114. {
  115. a[i]=(cp){A[i]&,A[i]>>};
  116. b[i]=(cp){B[i]&,B[i]>>};
  117. }
  118. m=len*; fft_init();
  119. fft(a,); fft(b,);
  120. for (int i=;i<n;i++)
  121. {
  122. int j=(n-)&(n-i);
  123. c[j]=(cp){0.5*(a[i].a+a[j].a),0.5*(a[i].b-a[j].b)}*b[i];
  124. d[j]=(cp){0.5*(a[i].b+a[j].b),0.5*(a[j].a-a[i].a)}*b[i];
  125. }
  126. fft(c,); fft(d,);
  127. double inv=ee/n;
  128. rep(i,,n) c[i].a*=inv,c[i].b*=inv;
  129. rep(i,,n) d[i].a*=inv,d[i].b*=inv;
  130. rep(i,,len)
  131. {
  132. ll a1=c[i].a+0.5,a2=c[i].b+0.5;
  133. ll a3=d[i].a+0.5,a4=d[i].b+0.5;
  134. B[i]=(a1+((a2+a3)%mo<<)+((a4%mo)<<))%mo;
  135. }
  136. clear();
  137. }
  138. int C[N],D[N];
  139. IL void getinv(int *A,int *B,int len)
  140. {
  141. if (len==) {B[]=fsp(A[],mo-); return;}
  142. getinv(A,B,(len+)>>);
  143. rep(i,,len-) C[i]=A[i];
  144. getcj(B,C,len); getcj(B,C,len);
  145. rep(i,,len-) B[i]=((2ll*B[i]-C[i])%mo+mo)%mo;
  146. }
  147. IL void getdao(int *A,int *B,int len)
  148. {
  149. for (int i=;i<len-;i++)
  150. B[i]=1ll*A[i+]*(i+)%mo;
  151. B[len-]=;
  152. }
  153. IL void getjf(int *A,int *B,int len)
  154. {
  155. for (int i=;i<len;i++)
  156. B[i]=1ll*A[i-]*fsp(i,mo-)%mo;
  157. B[]=;
  158. }
  159. IL void getln(int *A,int *B,int len)
  160. {
  161. getdao(A,C,len);
  162. getinv(A,D,len);
  163. getcj(C,D,len);
  164. getjf(D,B,len);
  165. }
  166. void getexp(int *A,int *B,int len)
  167. {
  168. if (len==) {B[]=; return;}
  169. getexp(A,B,(len+)>>);
  170. getln(B,C,len);
  171. rep(i,,len-) C[i]=((-C[i]+A[i])%mo+mo)%mo;
  172. C[]=(C[]+)%mo;
  173. getcj(C,B,len);
  174. }
  175. int main()
  176. {
  177. freopen("10.in","r",stdin);
  178. freopen("1.out","w",stdout);
  179. int n1;
  180. read(n1); read(mo);
  181. x1[]=;
  182. rep(i,,n1) read(x1[i]);
  183. p=(n1+)<<; init();
  184. getln(x1,x2,n1+);
  185. rep(i,,n1)
  186. {
  187. for (int j=;j*i<=n1;j++)
  188. x2[i*j]=(x2[i*j]-1ll*x2[i]*fsp(j,mo-))%mo;
  189. }
  190. int cnt=;
  191. rep(i,,n1) if (x2[i]) cnt++;
  192. wer(cnt); wer2();
  193. rep(i,,n1) if (x2[i]) wer(i),wer1();
  194. wer2();
  195. fwrite(sr,,C1+,stdout);
  196. return ;
  197. }

[BZOJ4913][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. P3784 [SDOI2017]遗忘的集合

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

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

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

  7. SDOI2017遗忘的集合

    题面链接 咕咕咕 题外话 为了这道题我敲了\(MTT\).多项式求逆.多项式\(ln\)等模板,搞了将近一天. sol 最近懒得写题解啊,随便搞搞吧. 看到这个就是生成函数套上去. \[F(x)=\p ...

  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. docker之常用命令、自定制镜像、公(私)仓库的上传和下载

    一.docker命令 1.参数和命令汇总 1. 参数 Options: --config=~/.docker Location of client config files #客户端配置文件的位置 - ...

  2. hdu 5536 Chip Factory (01 Trie)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=5536 题面; Chip Factory Time Limit: 18000/9000 MS (Java/O ...

  3. 关于FlexBox的布局

    关于FlexBox的布局 基本要素 因为FlexBox是一整个模块并不是一个单独的属性,它涉及到很多东西包括它的所有设置属性.一些属性是需要被设置在容器(父级元素,称为『弹性容器』),而一些其他的属性 ...

  4. matplotlib绘图总结

    本文作为学习过程中对matplotlib一些常用知识点的整理,方便查找. 类MATLAB API 最简单的入门是从类 MATLAB API 开始,它被设计成兼容 MATLAB 绘图函数. from p ...

  5. 友盟冲突解决com.umeng.weixin.handler.UmengWXHandler cannot be cast to com.umeng.socialize.handler.UMWXHandler

    删掉一个试试

  6. Windows编写的shell脚本,在linux上无法执行

    前两天由于要查一个数据库的binlog日志,经常用命令写比较麻烦,想着写一个简单的脚本,自动去刷一下数据库的binlog日志,就直接在windows上面写了,然后拷贝到linux中去运行,其实很简单的 ...

  7. redis简单命令总结

    1.连接到redis服务器:redis-cli -h 127.0.0.1 -p 6379 -a 密码 select index 切换 redis 数据库 flushdb 删除当前数据库所有的 key ...

  8. 剑指Offer_编程题_23

    题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. class Solution { public: ...

  9. Pandas系列(十四)- 实战案例

    一.series import pandas as pd import string #创建Series的两种方式 #方式一 t = pd.Series([1,2,3,4,43],index=list ...

  10. mui选择器的坑

    mui框架最近比较火,因为在移动端的页面展示效果太好了,web页面相当于APP的效果.连二年级的小明同学都知道了..你别说你不知道哦 但是这毕竟是一个不成熟的框架,维护和解决方案都跟不上,因此新手入坑 ...