传送门

神仙题鸭!orz dkw

暴力就是完全背包

而完全背包可以和生成函数扯上关系,记第i种物品质量为\(a_i\),那么这种物品的生成函数\(G(i)=\sum_{j=0}^{\infty}x^{a_ij}\),最后体积为i的答案即为这n个生成函数的卷积的第i项系数

然而用卷积复杂度为\(O(mnlogm)\),还不如暴力.说道卷积,我就想起了可以把多项式先求\(ln\),然后加起来,最后求\(exp\).只不过每个函数求\(ln\)复杂度还是不行,我们打表发现\(lnG(i)=\sum_{j=0}^{\infty}\frac{1}{j}x^{a_ij}\),所以直接把对应项的系数通过枚举倍数加好救星了,复杂度\(O(\sum_{i=1}^{m}\lfloor\frac{m}{i}\rfloor) \approx O(nlogn)\)

  1. #include<bits/stdc++.h>
  2. #define LL long long
  3. #define db double
  4. #define il inline
  5. #define re register
  6. using namespace std;
  7. const int N=270000+10,mod=998244353;
  8. il int rd()
  9. {
  10. int x=0,w=1;char ch=0;
  11. while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
  12. while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
  13. return x*w;
  14. }
  15. il int fpow(int a,int b){int an=1;while(b){if(b&1) an=1ll*an*a%mod;a=1ll*a*a%mod,b>>=1;} return an;}
  16. int rdr[N];
  17. il void ntt(int *a,int n,bool op)
  18. {
  19. int l=0,x,y;
  20. while((1<<l)<n) ++l;
  21. for(int i=0;i<n;++i) rdr[i]=(rdr[i>>1]>>1)|((i&1)<<(l-1));
  22. for(int i=0;i<n;++i) if(i<rdr[i]) swap(a[i],a[rdr[i]]);
  23. for(int i=1;i<n;i<<=1)
  24. {
  25. int ww=fpow(op?3:332748118,(mod-1)/(i<<1));
  26. for(int j=0;j<n;j+=i<<1)
  27. for(int k=0,w=1;k<i;++k,w=1ll*w*ww%mod)
  28. x=a[j+k],y=1ll*a[j+k+i]*w%mod,a[j+k]=(x+y)%mod,a[j+k+i]=(x-y+mod)%mod;
  29. }
  30. if(!op) for(int i=0,w=fpow(n,mod-2);i<n;++i) a[i]=1ll*a[i]*w%mod;
  31. }
  32. int p1[N],p2[N],p3[N],p4[N],p5[N],p6[N],inv[N];
  33. il void polyder(int *a,int *b,int n)
  34. {
  35. for(int i=0;i<n-1;++i) b[i]=1ll*a[i+1]*(i+1)%mod;
  36. b[n-1]=b[n]=0;
  37. }
  38. il void polying(int *a,int *b,int n)
  39. {
  40. for(int i=1;i<n;++i) b[i]=1ll*a[i-1]*inv[i]%mod;
  41. b[0]=0;
  42. }
  43. il void polyinv(int *a,int *b,int n)
  44. {
  45. if(n==1){b[0]=fpow(a[0],mod-2);return;}
  46. polyinv(a,b,n>>1);
  47. for(int i=0;i<n;++i) p1[i]=a[i],p2[i]=b[i];
  48. ntt(p1,n<<1,1),ntt(p2,n<<1,1);
  49. for(int i=0;i<(n<<1);++i) p1[i]=1ll*p1[i]*p2[i]%mod*p2[i]%mod;
  50. ntt(p1,n<<1,0);
  51. for(int i=0;i<n;++i) b[i]=((b[i]+b[i])%mod-p1[i]+mod)%mod;
  52. for(int i=0;i<(n<<1);++i) p1[i]=p2[i]=0;
  53. }
  54. il void polyln(int *a,int *b,int n)
  55. {
  56. polyder(a,p3,n),polyinv(a,p4,n);
  57. ntt(p3,n<<1,1),ntt(p4,n<<1,1);
  58. for(int i=0;i<(n<<1);++i) p3[i]=1ll*p3[i]*p4[i]%mod;
  59. ntt(p3,n<<1,0);
  60. polying(p3,b,n);
  61. for(int i=0;i<(n<<1);++i) p3[i]=p4[i]=0;
  62. }
  63. il void polyexp(int *a,int *b,int n)
  64. {
  65. if(n==1){b[0]=1;return;}
  66. polyexp(a,b,n>>1);
  67. polyln(b,p5,n);
  68. for(int i=0;i<n;++i) p5[i]=(mod-p5[i]+a[i])%mod,p6[i]=b[i];
  69. p5[0]=(p5[0]+1)%mod;
  70. ntt(p5,n<<1,1),ntt(p6,n<<1,1);
  71. for(int i=0;i<(n<<1);++i) p5[i]=1ll*p5[i]*p6[i]%mod;
  72. ntt(p5,n<<1,0);
  73. for(int i=0;i<n;++i) b[i]=p5[i];
  74. for(int i=0;i<(n<<1);++i) p5[i]=p6[i]=0;
  75. }
  76. int a[N],b[N],cn[N],n,m;
  77. int main()
  78. {
  79. n=rd(),m=rd();
  80. inv[0]=inv[1]=1;
  81. for(int i=2;i<=m;++i) inv[i]=(mod-1ll*mod/i*inv[mod%i]%mod)%mod;
  82. for(int i=1;i<=n;++i) ++cn[rd()];
  83. for(int i=1;i<=m;++i)
  84. {
  85. if(!cn[i]) continue;
  86. for(int j=1;i*j<=m;++j)
  87. a[i*j]=(a[i*j]+1ll*cn[i]*inv[j]%mod)%mod;
  88. }
  89. int l=1;
  90. while(l<m+1) l<<=1;
  91. polyexp(a,b,l);
  92. for(int i=1;i<=m;++i) printf("%d\n",b[i]);
  93. return 0;
  94. }

luogu P4389 付公主的背包的更多相关文章

  1. 洛谷 P4389 付公主的背包 解题报告

    P4389 付公主的背包 题目背景 付公主有一个可爱的背包qwq 题目描述 这个背包最多可以装\(10^5\)大小的东西 付公主有\(n\)种商品,她要准备出摊了 每种商品体积为\(V_i\),都有\ ...

  2. 洛谷 P4389: 付公主的背包

    题目传送门:洛谷 P4389. 题意简述: 有 \(n\) 个物品,每个物品都有无限多,第 \(i\) 个物品的体积为 \(v_i\)(\(v_i\le m\)). 问用这些物品恰好装满容量为 \(i ...

  3. 洛谷P4389 付公主的背包--生成函数+多项式

    题目链接戳这里 题目描述 有\(n\)件不同的商品,每件物品都有无限个,输出总体积为\([1,m]\)的方案数 思路 直接跑背包有\(30\) 考虑把每个物品的生成函数设出来,对于一件体积为\(v\) ...

  4. [luogu 4389] 付公主的背包

    题意:求一个较大的多重背包对于每个i的方案数,答案对998244353取模. 思路: 生成函数: 对于一个\(V\) 设: \(f(x) = \sum_{i=0}^{oo} x ^ {V * i} = ...

  5. P4389 付公主的背包

    注意 初始化的时候要这样写 for(int i=1,x;i<=n;i++){ scanf("%d",&x); v[x]++; } for(int i=1;i<= ...

  6. 洛谷P4389 付公主的背包 [生成函数,NTT]

    传送门 同样是回过头来发现不会做了,要加深一下记忆. 思路 只要听说过生成函数的人相信第一眼都可以想到生成函数. 所以我们要求 \[ ans=\prod \sum_n x^{nV}=\prod \fr ...

  7. [洛谷P4389]付公主的背包

    题目大意:有$n(n\leqslant10^5)$种物品,第$i$个物品体积为$v_i$,都有$10^5$件.给定$m(m\leqslant10^5)$,对于$s\in [1,m]$,请你回答用这些商 ...

  8. LuoguP4389 付公主的背包【生成函数+多项式exp】

    题目背景 付公主有一个可爱的背包qwq 题目描述 这个背包最多可以装10^5105大小的东西 付公主有n种商品,她要准备出摊了 每种商品体积为Vi,都有10^5105件 给定m,对于s\in [1,m ...

  9. luoguP4389 付公主的背包

    luogu 显然这是个背包题 显然物品的数量是不用管的 所以考虑大小为\(v\)的物品可以装的体积用生成函数表示一下 \[ f(x)=\sum_{i=0}^{+\infty}x^{vi}=\frac{ ...

随机推荐

  1. N球M盒

    N球,M盒,由于球是否相同,盒是否相同,盒是否可以为空,共2^3=8种: 1.球同,盒同,盒不可以为空Pm(N)--这符号表示部分数为m的N-分拆的个数,m是P的下标,为了好看我将大写的M弄成小写 2 ...

  2. vue2.0项目实战(5)vuex快速入门

    Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化.Vuex 也集成到 Vue 的官方调试工具  ...

  3. mysql数据库的优化和查询效率的优化

    一.数据库的优化 1.优化索引.SQL 语句.分析慢查询: 2.设计表的时候严格根据数据库的设计范式来设计数据库: 3.使用缓存,把经常访问到的数据而且不需要经常变化的数据放在缓存中,能节约磁盘IO: ...

  4. Codeforces Round #529 (Div. 3) F.Make It Connected

    传送门 题意: 有 n 个顶点,每个顶点有个花费 a[ i ],连接顶点 u,v 需要花费 a[v]+a[u]的代价. 有 m 个特殊边,每条边有三个参数 u,v,w 代表的意思是连接 u,v 的花费 ...

  5. 老项目用webpack中文乱码问题解决记录

    有个很久(有多久呢,你还记得jquery1.6的年代吗...)的项目需要新加一些功能,又想使用新的生产力工具比如说webpack,es6,vue神马的.原来的项目整体都是用GBK编码的,这特么...坑 ...

  6. 安装webpack-dev-server始终不成功

    先安装了webpack,后来安装webpack-dev-server会一直出现这个问题,我把webpack提示的1.0.0 , 2.0.0 ,3.0.0全都在全局装了一遍都没用,还是会出现这个问题.最 ...

  7. Spring Cloud Netflix Eureka: 多网卡环境下Eureka服务注册IP选择问题

    https://blog.csdn.net/neosmith/article/details/53126924 通过源码可以看出,该工具类会获取所有网卡,依次进行遍历,取ip地址合理.索引值最小且不在 ...

  8. C++: 带参数回调函数和不带参数的回调函数;

    在C++中,回调函数的应用比较广泛且重要. 通过传递函数指针到其他地方,能够实现远程回调的作用,能够实现远程调用而不需要事件触发信号或者其他机制来实现,方便而快捷: 首先,回调函数有两种形式:  静态 ...

  9. Linux报错

    Linux报错 ------------------- 在VMware虚拟机中配置yum源时,执行 mount /dev/cdrom /mnt/cdrom 出现 mount: no medium fo ...

  10. Linux Cluster 基础之LVS调度算法与集群类型

    Linux Cluster 基础之LVS调度算法与集群类型 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.LB Cluster 1>.什么是LB LB 集群是 load ...