题目描述
这个背包最多可以装10510^5105大小的东西
付公主有nnn种商品,她要准备出摊了
每种商品体积为ViV_iVi​,都有10510^5105件
给定mmm,对于s∈[1,m]s\in [1,m]s∈[1,m],请你回答用这些商品恰好装sss体积的方案数

输入输出格式

输入格式:
第一行n,mn,mn,m

第二行V1V_1V1​,VnV_nVn​

输出格式:
m行,第i行代表s=i时方案数,对998244353取模

输入输出样例

输入样例#1:
2 4
1 2
输出样例#1:
1
2
2
3
说明

对于30%的数据,n&lt;=3000,m&lt;=3000n&lt;=3000,m&lt;=3000n<=3000,m<=3000

对于60%的数据,纯随机生成

对于100%的数据, n&lt;=100000,m&lt;=100000n&lt;=100000,m&lt;=100000n<=100000,m<=100000

对于100%的数据,Vi&lt;=mV_i&lt;=mVi​<=m

分析:
对于一种体积为vvv的物品可以用多项式∑i≥0xvi\sum_{i≥0}x^{vi}∑i≥0​xvi代替。
所有的多项式的卷积就是答案。这样才能保证没有重复。
直接卷积肯定不行,考虑先对所有多项式求ln,然后相加,最后多项式exp。
然后发现求ln后的多项式为∑i&gt;01ixvi\sum_{i&gt;0}\frac{1}{i}x^{vi}∑i>0​i1​xvi。
多项式exp即可。

代码:

// luogu-judger-enable-o2
#include <iostream>
#include <cstdio>
#include <cmath>
#define LL long longconst LL mod=998244353;
const LL G=3;
const int maxn=6e5+7;using namespace std;int n,m,v,len;
int r[maxn];
LL a[maxn],b[maxn],c[maxn],s[maxn],f[maxn],g[maxn],h[maxn],num[maxn],ny[maxn],inv[maxn],w[maxn];LL ksm(LL x,LL y)
{if (y==1) return x;LL c=ksm(x,y/2);c=(c*c)%mod;if (y&1) c=(c*x)%mod;return c;
}void ntt(LL *a,int f)
{for (int i=0;i<len;i++){if (i<r[i]) swap(a[i],a[r[i]]);}w[0]=1;for (int i=2;i<=len;i*=2){LL wn;if (f==1) wn=ksm(G,(LL)(mod-1)/i);else wn=ksm(G,(LL)(mod-1)-(mod-1)/i);for (int j=i/2;j>=0;j-=2) w[j]=w[j/2];for (int j=1;j<i/2;j+=2) w[j]=(w[j-1]*wn)%mod;for (int j=0;j<len;j+=i){for (int k=0;k<i/2;k++){LL u=a[j+k],v=a[j+k+i/2]*w[k]%mod;a[j+k]=(u+v)%mod;a[j+k+i/2]=(u+mod-v)%mod;}}}if (f==-1){LL inv=ksm(len,mod-2);for (int i=0;i<len;i++) a[i]=a[i]*inv%mod;}
}void NTT(LL *x,LL *y,LL *z,int n,int m)
{len=1;int k=0;while (len<=(n+m)) len*=2,k++;for (int i=0;i<len;i++){r[i]=(r[i>>1]>>1)|((i&1)<<(k-1));}for (int i=0;i<len;i++){if (i<n) a[i]=x[i]; else a[i]=0;if (i<m) b[i]=y[i]; else b[i]=0;}ntt(a,1); ntt(b,1);for (int i=0;i<len;i++) z[i]=(a[i]*b[i])%mod;ntt(z,-1);
}void getinv(LL *f,LL *g,int deg)
{if (deg==1){g[0]=ksm(f[0],mod-2);return;}int d=(deg+1)/2;getinv(f,g,d);NTT(f,g,c,deg,d);c[0]=(2+mod-c[0])%mod;for (int i=1;i<deg;i++) c[i]=(mod-c[i])%mod;NTT(c,g,g,deg,d);for (int i=deg;i<len;i++) g[i]=0;
}void tran(LL *a,LL *b,int deg)
{for (int i=1;i<deg;i++) b[i-1]=(i*a[i])%mod;b[deg-1]=0;
}void intran(LL *a,LL *b,int deg)
{for (int i=1;i<deg;i++) b[i]=a[i-1]*ksm(i,mod-2)%mod;b[0]=0;
}void ln(LL *f,LL *g,int n)
{getinv(f,inv,n);tran(f,f,n);NTT(f,inv,f,n,n);intran(f,g,n);
}void solve(LL *f,LL *g,int deg)
{if (deg==1){g[0]=1;             return;}int mid=(deg+1)/2;solve(f,g,mid);for (int i=0;i<mid;i++) s[i]=g[i];ln(s,h,mid);h[0]=(f[0]+1+mod-h[0])%mod;for (int i=1;i<mid;i++) h[i]=(f[i]+mod-h[i])%mod;NTT(h,g,g,mid,mid);for (int i=deg;i<len;i++) g[i]=h[i]=0;
}int main()
{scanf("%d%d",&n,&m);for (int i=1;i<=n;i++){scanf("%d",&v);num[v]++;}  for (int i=1;i<=m;i++) ny[i]=ksm(i,mod-2);for (int i=1;i<=m;i++){if (num[i]){for (int j=1;j*i<=m;j++){f[i*j]=(f[i*j]+num[i]*ny[j]%mod)%mod;}}}m++;    solve(f,g,m<<1);for (int i=1;i<m;i++) printf("%lld\n",g[i]);
}

洛谷 P4389 付公主的背包 多项式exp相关推荐

  1. P4389 付公主的背包(生成函数,多项式exp)

    P4389 付公主的背包 考虑生成函数有: ∏i=1n11−xvi对其取对数得,∑i=1nln⁡11−xviF(x)=11−xv,G(x)=ln⁡F(x)G(x)=∫F′(x)F(x)dxG(x)=∫ ...

  2. P4389 付公主的背包(生成函数/多项式)

    P4389 付公主的背包 https://www.luogu.com.cn/problem/solution/P4389 经典生成函数问题 求解无限背包问题,我们可以将每个物品看作一个多项式,那么最后 ...

  3. 【洛谷4389】付公主的背包(生成函数,多项式运算)

    [洛谷4389]付公主的背包(生成函数,多项式运算) 题面 有一个容量最多为\(10^5\)的背包 有\(n\)种物品,数量无限,题解是\(v_i\) 给定一个\(m\),求所有\(s\in[1,m] ...

  4. luogu4389 付公主的背包

    题目链接:洛谷 题目大意:现在有$n$个物品,每种物品体积为$v_i$,对任意$s\in [1,m]$,求背包恰好装$s$体积的方案数(完全背包问题). 数据范围:$n,m\leq 10^5$ 这道题 ...

  5. 洛谷P4233 射命丸文的笔记 【多项式求逆】

    题目链接 洛谷P4233 题解 我们只需求出总的哈密顿回路个数和总的强联通竞赛图个数 对于每条哈密顿回路,我们统计其贡献 一条哈密顿回路就是一个圆排列,有\(\frac{n!}{n}\)种,剩余边随便 ...

  6. 洛谷 p1757 通天之分组背包(哈希,分组背包)2021-08-12

    题目背景 直达通天路·小 A 历险记第二篇 题目描述 自 01 背包问世之后,小 A 对此深感兴趣.一天,小 A 去远游,却发现他的背包不同于 01 背包,他的物品大致可分为 k 组,每组中的物品相互 ...

  7. 洛谷P4389:付公主的背包(多项式、生成函数)

    对于一些生成函数累乘的题目,也许可以通过求 ln⁡\lnln 转化为累加问题从而完成简化. 解析 不难写出对于单个物品 kkk 的生成函数: ∑i=1xVi=11−xVK\sum_{i=1}x^{Vi ...

  8. 洛谷P4705 玩游戏(生成函数+多项式运算)

    题面 传送门 题解 妈呀这辣鸡题目调了我整整三天--最后发现竟然是因为分治\(NTT\)之后的多项式长度不是\(2\)的幂导致把多项式的值存下来的时候发生了一些玄学错误--玄学到了我\(WA\)的点全 ...

  9. 洛谷 P1049 装箱问题(01背包)

    一道水题,但看到好久没有发博客了,再一看是一道noip普及组t4,就做了. 题目链接 https://www.luogu.org/problemnew/show/P1049 解题思路 一道裸的01背包 ...

最新文章

  1. FDA转向AI加快药物研发和审批速度
  2. 51CTO-风哥-ORACLE学习计划(持续更新中)
  3. Ctrl+D 快捷键:浏览器 · 添加收藏按钮
  4. 玩转linux——Screen管理远程会话,再也不怕关闭SSH就中断会话了
  5. (136)System Verilog覆盖组参数传递实例
  6. Android Studio(12)----Git使用教程之本地仓库的基本操作
  7. Qemu 简述 | 转
  8. Python+matplotlib绘制三维图形5个精选案例
  9. 洛谷P1102 A-B
  10. 学校计算机社团面试问题及答案,社团二轮面试题目
  11. React + TS项目开发小技巧总结
  12. java批量添加注解到所有业务接口
  13. 关于AndroBench在Android 10以后性能衰减的问题分析
  14. Android 连接USB设备(主机模式)
  15. android 自定义popupwindow,自定义通过PopupWindow实现通用菜单
  16. Could not find com.android.tools.build:gradle:3.2.0. Searched in the follo
  17. 与阿里云整个生态体系共同成长,更快更好的为房地产行业客户提供高价值的服务。...
  18. 2022年总结 | 从初二学生到算法作者的蜕变之路
  19. idea中安装统计代码statistic插件
  20. error 65: access violation at 0x40021000 : no 'read' permission

热门文章

  1. 常见4种风险定量分析法
  2. Leetcode 414. 第三大的数(详解 C语言实现)
  3. 电源的降压(Buck)与升压(Boost)模式
  4. IKEA(宜家)营销神话——“让用户成为产品的创造者”!
  5. CRUX下实现进程隐藏(1)
  6. 实用技巧,分享五个不为人知的PS隐藏技巧
  7. Single TPR论文解读
  8. redhat linux 9.0 拷贝u盘的文件,Linux redhat 9.0 中挂载U盘的方法!
  9. 操作系统原理 实验1、2
  10. 从BAT到ATM,蚂蚁金服的逻辑和风险