题意:求一个较大的多重背包对于每个i的方案数,答案对998244353取模。

思路:

生成函数:

对于一个\(V\)

设:

\(f(x) = \sum_{i=0}^{oo} x ^ {V * i} = {1 \over {1 - x ^ V}}\)

那么就是求这个生成函数的积。

首先将\(f(x)\)取\(ln\)为\(g(x)\),最后\(exp\)回去得到答案。

\(g'(x) = {f'(x) \over f(x)} = (1 - x^V)\sum_{i = 1}^{oo}V * i * x ^ {V}\)

最终\(exp\)一遍得到答案。

时间复杂度\(O(mlogm)\)

#include <bits/stdc++.h>
using namespace std;
const int maxn = 5000010;
const int mod = 998244353;
const int g = 3;
#define ll long long
int A[maxn];
int B[maxn];
int c[maxn],d[maxn];
int e[maxn];
int f[maxn];
int w[maxn][2];
int rev[maxn];
int cnt[maxn];
int v[maxn];
int ans[maxn];
int inv[maxn];
const int vg = (mod + 1) / 3;
int n,m,l;
int len;
inline int read() {
int q=0,f=1;char ch = getchar();
while(!isdigit(ch)){
if(ch=='-')f=-1;ch=getchar();
}
while(isdigit(ch)){
q=q*10+ch-'0';ch=getchar();
}
return q*f;
}
inline int pow_mod (int x,int y) {
int res = 1;
while(y) {
if(y & 1) res = (ll) res * x % mod;
x = (ll) x * x % mod;
y >>= 1;
}
return res;
}
inline void NTT(int *a,int n,int type) {
for(len = 1,l = 0;len <= n;len <<= 1, ++l);
for(int i = 0;i < len; ++i) {
rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (l - 1));
}
for(int i = 0;i < len; ++i) {
if(i < rev[i]) {
swap(a[i],a[rev[i]]);
}
}
for(int i = 1;i < len; i <<= 1) {
int wn = (~type) ? w[i][0]:w[i][1];
for(int j = 0;j < len;j += (i << 1)) {
int w = 1;
for(int k = 0;k < i; ++k,w = (ll)w * wn % mod) {
int x = (ll)a[i + j + k];
int y = a[j + k];
a[j + k] = (x + y) % mod;
a[i + j + k] = (y + mod - x) % mod;
}
}
}
if(type == -1) {
int tmp = pow_mod(len,mod - 2);
for(int i = 0;i < len; ++i) {
a[i] = (ll)a[i] * tmp % mod;
}
}
}
inline void get_Inv(int *a,int *b,int n) {
if(n == 1) {
b[0] = pow_mod(a[0],mod - 2);
return;
}
get_Inv(a,b,n >> 1);
for(int i = 0;i < n; ++i) {
A[i] = a[i];
B[i] = b[i];
}
NTT(A,n << 1,1);
NTT(B,n << 1,1);
for(int i = 0;i < len; ++i) {
A[i] = (ll)A[i] * B[i] % mod * B[i] % mod;
}
NTT(A,n << 1,-1);
for(int i = 0;i < n; ++i) {
b[i] = ((b[i] << 1) % mod - A[i] + mod) % mod;
}
for(int i = 0;i < len; ++i) {
A[i] = B[i] = 0;
}
} inline void get_ln(int *a,int *b,int n) {
get_Inv(a,c,n);
for(int i = 0;i < n - 1; ++i) {
d[i] = (ll)(i + 1) * a[i + 1] % mod;
}
NTT(c,n << 1,1);
NTT(d,n << 1,1);
for(int i = 0;i < len; ++i) {
c[i] = (ll) c[i] * d[i] % mod;
}
NTT(c,n << 1,-1);
for(int i = 1;i < n; ++i) {
b[i] = (ll)inv[i] * c[i - 1] % mod;
}
for(int i = 0;i < len; ++i) {
c[i] = d[i] = 0;
}
} inline void get_exp(int *a,int *b,int n) {
if(n == 1) {
b[0] = 1;
return;
}
get_exp(a,b,n >> 1);
for(int i = 0;i < n; ++i) {
e[i] = b[i];
}
get_ln(b,f,n);
for(int i = 0;i < n; ++i) {
f[i] = (mod - f[i] + a[i]) % mod;
f[0] = (f[0] + 1)%mod;
}
NTT(e,n << 1,1);
NTT(f,n << 1,1);
for(int i = 0;i < len; ++i) {
e[i] = (ll)e[i] * f[i] % mod;
}
NTT(e,n << 1,-1);
for(int i = 0;i < n; ++i) {
b[i] = e[i];
}
for(int i = 0;i < len; ++i) {
e[i] = f[i] = 0;
}
} int main () {
n = read(),m = read();
inv[1] = 1;
for(int i = 1;i <= n; ++i) {
++cnt[read()];
}
int tmp = 1;
for(;tmp <= m;tmp <<= 1);
for(int i = 1;i <= (tmp << 1);i <<= 1) {
w[i][0] = pow_mod(g,(mod - 1)/(i << 1));
w[i][1] = pow_mod(vg,(mod - 1)/(i<<1));
}
for(int i = 2;i <= tmp; ++i) {
inv[i] = (ll)(mod - mod / i) * inv[mod % i]%mod;
}
for(int i = 1;i <= m; ++i) {
if(cnt[i]) {
int dl = (ll) i * cnt[i] % mod;
for(int j = 1;i * j <= m; ++j) {
v[i * j] = (v[i * j] + dl) % mod;
}
}
}
for(int i = 1;i <= m; ++i) {
v[i] = (ll)inv[i] * v[i] % mod;
}
get_exp(v,ans,tmp);
for(int i = 1;i <= m; ++i) {
printf("%d\n",ans[i] % mod);
}
return 0;
}
//原地爆炸

[luogu 4389] 付公主的背包的更多相关文章

  1. luogu P4389 付公主的背包

    传送门 神仙题鸭!orz dkw 暴力就是完全背包 而完全背包可以和生成函数扯上关系,记第i种物品质量为\(a_i\),那么这种物品的生成函数\(G(i)=\sum_{j=0}^{\infty}x^{ ...

  2. 洛谷 4389 付公主的背包——多项式求ln、exp

    题目:https://www.luogu.org/problemnew/show/P4389 关于泰勒展开: https://blog.csdn.net/SoHardToNamed/article/d ...

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

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

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

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

  5. luoguP4389 付公主的背包

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

  6. [luogu4389]付公主的背包(多项式exp)

    完全背包方案计数问题的FFT优化.首先写成生成函数的形式:对重量为V的背包,它的生成函数为$\sum\limits_{i=0}^{+\infty}x^{Vi}=\frac{1}{1-x^{V}}$于是 ...

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

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

  8. luogu4389 付公主的背包

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

  9. P3489 付公主的背包

    题意:n<=1e5,m<=1e5,跑n个物品1到m容量的完全背包. 考虑暴力的做法就是把一些1/(1+x^a)的多项式乘起来即可. 考虑优化,取一下ln,转化为加法,然后exp回去就好了.

随机推荐

  1. 【原理】RabbitMQ架构图

    Broker:它提供一种传输服务,它的角色就是维护一条从生产者到消费者的路线,保证数据能按照指定的方式进行传输, Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列. Queue:消息 ...

  2. 行业顶级NoSQL成员坐阵,NoSQL数据库专场重点解析!

    NoSQL数据库作为数据库市场最重要的组成之一,它的一举一动都影响着成千上万的企业.本专场邀请了行业顶级的NoSQL核心成员与大家共同展望NoSQL数据库的未来,阿里巴巴.MongoDB.Rediss ...

  3. 高级运维(六):源码安装Redis缓存服务、常用Redis数据库操作指令、配置Redis主从服务器

    一.源码安装Redis缓存服务 目标: 本案例要求先快速搭建好一台Redis服务器,并测试该缓存服务器: 1> 设置变量test,值为123 2> 查看变量test的值 3> 设置计 ...

  4. 2015 ACM/ICPC Asia Regional Changchun Online HDU - 5441 (离线+并查集)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5441 题意:给你n,m,k,代表n个城市,m条边,k次查询,每次查询输入一个x,然后让你一个城市对(u,v ...

  5. 【系统安全性】四、认证Authentication

    四.认证Authentication 1.为什么要认证 对请求.数据进行认证,判断伪造的数据 HTTP请求很脆弱,抓包软件很强大,容易伪造身份,非法获取数据 2.摘要认证 对象:客户端参数.服务端响应 ...

  6. 数据结构学习笔记——顺序数组1

    线性表最简单的刚开始就是顺序存储结构,我是看着郝斌的视频一点一点来的,严蔚敏的书只有算法,没有具体实现,此笔记是具体的实现 为什么数据结构有ADT呢,就是为了满足数据结构的泛性,可以在多种数据类型使用 ...

  7. angularjs 中使用 service 在controller 之间 share 对象和数据

    在做angularjs 的UI 时,我们经常会遇到一个页面之间有几个controller,在controller 之间share 公共的一些数据和方法就变得比较困难,目前推荐的做法是创建一个servi ...

  8. unittest框架学习笔记五之参数化

    例子一: # coding=utf-8'''created:2018/3/29 author:star project:lianxi canshuhua'''from selenium import ...

  9. HTML中列表中元素居中问题

    想让列表<table>中某一行元素居中的话,单纯使用<align  = 'center'>是达不到效果的,需要先将该行进行合并,使用colspan属性. <html> ...

  10. extern static和函数

    #include <stdio.h> int sum(int a, int b); int main() { /************************************** ...