完全背包方案计数问题的FFT优化。
首先写成生成函数的形式:对重量为V的背包,它的生成函数为$\sum\limits_{i=0}^{+\infty}\frac{x^{Vi}}{i}=\frac{1}{1-x^{V}}$
于是答案就是$\prod \frac{1}{1-x^{V_k}}$。
直接做显然会超时,考虑使用ln将乘法变为加法。
https://www.cnblogs.com/cjyyb/p/10132855.html

 #include<cmath>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define mem(a) memset(a,0,sizeof(a))
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
using namespace std; const int N=,mod=,inv2=(mod+)/;
int n,m,v,cnt[N],rev[N],inv[N],X[N],Y[N],A[N],D[N],E[N],F[N]; void Print(int a[],int n=::n){ for (int i=; i<n; i++) printf("%d ",a[i]); puts(""); } int ksm(int a,int b){
int res=;
for (; b; a=1ll*a*a%mod,b>>=)
if (b & ) res=1ll*res*a%mod;
return res;
} void NTT(int a[],int n,bool f){
for (int i=; i<n; i++) if (i<rev[i]) swap(a[i],a[rev[i]]);
for (int i=; i<n; i<<=){
int wn=ksm(,f ? (mod-)/(i<<) : (mod-)-(mod-)/(i<<));
for (int p=i<<,j=; j<n; j+=p){
int w=;
for (int k=; k<i; k++,w=1ll*w*wn%mod){
int x=a[j+k],y=1ll*w*a[i+j+k]%mod;
a[j+k]=(x+y)%mod; a[i+j+k]=(x-y+mod)%mod;
}
}
}
if (f) return;
int inv=ksm(n,mod-);
for (int i=; i<n; i++) a[i]=1ll*a[i]*inv%mod;
} void mul(int a[],int b[],int l){
int n=,L=;
for (; n<(l<<); n<<=) L++;
for (int i=; i<n; i++) rev[i]=(rev[i>>]>>)|((i&)<<(L-));
NTT(a,n,); NTT(b,n,);
for (int i=; i<n; i++) a[i]=1ll*a[i]*b[i]%mod;
NTT(a,n,); NTT(b,n,);
} void Inv(int a[],int b[],int l){
if (l==){ b[]=ksm(a[],mod-); return; }
Inv(a,b,l>>); int n=,L=;
for (; n<(l<<); n<<=) L++;
for (int i=; i<n; i++) rev[i]=(rev[i>>]>>)|((i&)<<(L-));
for (int i=; i<l; i++) A[i]=a[i];
NTT(A,n,); NTT(b,n,);
for (int i=; i<n; i++) b[i]=1ll*b[i]*(-1ll*A[i]*b[i]%mod+mod)%mod;
NTT(b,n,);
for (int i=l; i<n; i++) b[i]=;
for (int i=; i<n; i++) A[i]=;
} void Deri(int a[],int b[],int l){
for (int i=; i<l; i++) b[i-]=1ll*i*a[i]%mod;
} void Inte(int a[],int b[],int l){
for (int i=; i<l; i++) b[i]=1ll*a[i-]*inv[i]%mod; b[]=;
} void Ln(int a[],int b[],int l){
Deri(a,D,l); Inv(a,E,l); mul(D,E,l); Inte(D,b,l);
for (int i=; i<(l<<); i++) D[i]=E[i]=;
} void Exp(int a[],int b[],int l){
if (l==){ b[]=; return; }
Exp(a,b,l>>); Ln(b,F,l); int n=,L=;
for (; n<(l<<); n<<=) L++;
for (int i=; i<n; i++) rev[i]=(rev[i>>]>>)|((i&)<<(L-));
for (int i=; i<l; i++) F[i]=(-F[i]+a[i]+mod)%mod; F[]=(F[]+)%mod;
NTT(F,n,); NTT(b,n,);
for (int i=; i<n; i++) b[i]=1ll*b[i]*F[i]%mod;
NTT(b,n,);
for (int i=l; i<n; i++) b[i]=;
for (int i=; i<n; i++) F[i]=;
} int main(){
freopen("4389.in","r",stdin);
freopen("4389.out","w",stdout);
scanf("%d%d",&n,&m);
int l=; for (; l<=m; l<<=); inv[]=inv[]=;
rep(i,,l) inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
rep(i,,n) scanf("%d",&v),cnt[v]++;
rep(i,,m) if (cnt[i]) for (int j=; j*i<=m; j++) X[j*i]=(X[j*i]+1ll*cnt[i]*inv[j])%mod;
Exp(X,Y,l);
rep(i,,m) printf("%d\n",Y[i]);
return ;
}

[luogu4389]付公主的背包(多项式exp)的更多相关文章

  1. luoguP4389 付公主的背包 多项式exp

    %%%dkw 话说这是个论文题来着... 考虑生成函数\(OGF\) 对于价值为\(v\)的物品,由于有\(10^5\)的件数,可以看做无限个 那么,其生成函数为\(x^0 + x^{v} + x^{ ...

  2. Luogu4389 付公主的背包(生成函数+多项式exp)

    显然构造出生成函数,对体积v的物品,生成函数为1+xv+x2v+……=1/(1-xv).将所有生成函数乘起来得到的多项式即为答案,设为F(x),即F(x)=1/∏(1-xvi).但这个多项式的项数是Σ ...

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

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

  4. luogu4389 付公主的背包

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

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

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

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

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

  7. 【Luogu4389】付公主的背包

    题目 传送门 解法 答案显然是\(n\)个形如\(\sum_{i \geq 1} x^{vi}\)的多项式的卷积 然而直接NTT的时间复杂度是\(O(nm\log n)\) 我们可以把每个多项式求\( ...

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

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

  9. luogu P4389 付公主的背包

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

随机推荐

  1. 南京邮电大学 CTF 逆向部分 Writeup

    Hello,RE! 提示 IDA 中按 R . Google 到 IDA 中 R 快捷键是 Character ,转为字符串. 丢进 IDA(虽然我并不会使用 IDA 有个 strcmp 函数,比较 ...

  2. OpenCV 用二进制位表示 type & channels 的方式

    OpenCV 的类型与通道的表示方法. 参考文件 https://github.com/opencv/opencv/blob/05b15943d6a42c99e5f921b7dbaa8323f3c04 ...

  3. 怎么修改oracle用户密码

    在以SYSDBA身份登陆时可以修改其他用户的密码,比如: SQL> alter user user01 identified by user10;

  4. aarch64_g2

    ghc-cryptonite-devel-0.21-1.fc26.aarch64.rpm 2017-02-28 01:28 3.1M fedora Mirroring Project ghc-css- ...

  5. NuGet服务器搭建教程

    本文主要来自网络,进行整理而成,相关文章如下: http://diaosbook.com/Post/2012/12/15/setup-private-nuget-server https://www. ...

  6. 003_ElasticSearch详解与优化设计

    简介 概念 安装部署 ES安装 数据索引 索引优化 内存优化 1简介 ElasticSearch(简称ES)是一个分布式.Restful的搜索及分析服务器,设计用于分布式计算:能够达到实时搜索,稳定, ...

  7. Python大数据处理案例

    分享 知识要点:lubridate包拆解时间 | POSIXlt利用决策树分类,利用随机森林预测利用对数进行fit,和exp函数还原 训练集来自Kaggle华盛顿自行车共享计划中的自行车租赁数据,分析 ...

  8. jexus linux x64[标准版] - 未集成mono 配置https

    一.找到mono安装位置 sudo find / -name mono 二.首先查看“/lib”或“/usr/lib”等系统库文件夹中是否有SSL库文件的名字,该文件名应该是“libssl.so.版本 ...

  9. java基础61 JavaScript循环语句之while、do...while、for及for...in循环(网页知识)

    本文知识点(目录): 1.while循环语句    2.do...while循环语句    3.for循环语句    4.for...in循环语句    5.附录1(with语句)    6.附录2( ...

  10. elasticsearch5.5

    1.不能以root用户运行 groupadd es          #增加es组 useradd es -g es -p pwd          #增加es用户并附加到es组 chown -R e ...