P4389-付公主的背包【生成函数,多项式exp】

正题

题目链接:https://www.luogu.com.cn/problem/P4389


题目大意

nnn种物品,第iii种大小为viv_ivi,数量无限。对于每个s∈[1,m]s\in[1,m]s[1,m]求刚好填满sss容量的方案数。

1≤n,m≤1051\leq n,m\leq 10^51n,m105


解题思路

统计和为一定值的方案数,好像可以生成函数做?

每种物品大小vvv有一个生成函数
F(x)=∑i≥0xi×v=11−xvF(x)=\sum_{i\geq 0}x^{i\times v}=\frac{1}{1-x^v}F(x)=i0xi×v=1xv1
然后所有生成函数乘起来就好了,但这样是O(n2log⁡n)O(n^2\log n)O(n2logn)的比暴力还慢…

乘起来比较慢,如果lnlnln之后改成加法就好了,但是lnlnln也是O(n)O(n)O(n)的。不过我们的式子比较特殊,对于lnlnln之后求个导就会有神器的结果
ln′(1−xv)=(1−xv)′1−xv=−v×xv−11−xvln'(1-x^v)=\frac{(1-x^v)'}{1-x^v}=\frac{-v\times x^{v-1}}{1-x^v}ln(1xv)=1xv(1xv)=1xvv×xv1
=−v∑i≥0xv−1+v×i=-v\sum_{i\geq 0}x^{v-1+v\times i}=vi0xv1+v×i
然后在积分回去就是
−∑i≥0xv+v×ii=−∑i≥1xv×ii-\sum_{i\geq 0}\frac{x^{v+v\times i}}{i}=-\sum_{i\geq 1}\frac{x^{v\times i}}{i}i0ixv+v×i=i1ixv×i
然后记录每个大小的物品出现了多少次,之后O(mlog⁡m)O(m\log m)O(mlogm)加系数,然后再exp+exp+exp+求逆回去就好了。

时间复杂度O(n+mlog⁡m)O(n+m\log m)O(n+mlogm)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=4e5+10,P=998244353;
ll n,c,l,r[N],f[N],v[N],inv[N];
ll t1[N],t2[N],t3[N],t4[N],t5[N],t6[N];
ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%P;x=x*x%P;b>>=1;}return ans;
}
void Glen(ll m){n=1;while(n<=m)n<<=1;for(ll i=0;i<n;i++)r[i]=(r[i>>1]>>1)|((i&1)?(n>>1):0);return;
}
void NTT(ll *f,ll op){for(ll i=0;i<n;i++)if(i<r[i])swap(f[i],f[r[i]]);for(ll p=2;p<=n;p<<=1){ll len=p>>1,tmp=power(3,(P-1)/p);if(op==-1)tmp=power(tmp,P-2);for(ll k=0;k<n;k+=p){ll buf=1;for(ll i=k;i<k+len;i++){ll tt=f[i+len]*buf%P;f[i+len]=(f[i]-tt+P)%P;f[i]=(f[i]+tt)%P;buf=buf*tmp%P;}}}if(op==-1){ll inv=power(n,P-2);for(ll i=0;i<n;i++)f[i]=f[i]*inv%P;}return;
}
void GetInv(ll *f,ll *g,ll m){if(m==1){g[0]=power(f[0],P-2);return;}GetInv(f,g,m>>1);Glen(m);for(ll i=0;i<m;i++)t1[i]=f[i],t2[i]=g[i];NTT(t1,1);NTT(t2,1);for(ll i=0;i<n;i++)t1[i]=t1[i]*t2[i]%P*t2[i]%P;NTT(t1,-1);for(ll i=0;i<m;i++)g[i]=(g[i]*2-t1[i]+P)%P;for(ll i=0;i<n;i++)t1[i]=t2[i]=0;return;
}
void GetD(ll *f,ll *g,ll n){for(ll i=0;i<n-1;i++)g[i]=f[i+1]*(i+1)%P;g[n-1]=0;return;
}
void GetJ(ll *f,ll *g,ll n){for(ll i=n-1;i>0;i--)g[i]=f[i-1]*power(i,P-2)%P;g[0]=0;return;
}
void GetLn(ll *f,ll *g,ll m){Glen(m);GetD(f,t3,n);GetInv(f,t4,n);Glen(m);Glen(n);NTT(t3,1);NTT(t4,1);for(ll i=0;i<n;i++)t3[i]=t3[i]*t4[i];NTT(t3,-1);GetJ(t3,g,n);for(ll i=0;i<n;i++)t3[i]=t4[i]=0;return;
}
void GetExp(ll *f,ll *g,ll m){if(m==1){g[0]=1;return;}GetExp(f,g,m>>1);GetLn(g,t5,m);Glen(m);for(ll i=0;i<m;i++)t6[i]=f[i];for(ll i=m;i<n;i++)t5[i]=0;NTT(t5,1);NTT(t6,1);NTT(g,1);for(ll i=0;i<n;i++)g[i]=g[i]*(1-t5[i]+t6[i]+P)%P;NTT(g,-1);for(ll i=m;i<n;i++)g[i]=0;return;
}
signed main()
{scanf("%lld%lld",&c,&l);inv[1]=1;for(ll i=2;i<N;i++)inv[i]=P-(P/i)*inv[P%i]%P;for(ll i=1;i<=c;i++){ll x;scanf("%lld",&x);v[x]++;}Glen(l);for(ll i=l;i>=1;i--){ll w=v[i];v[i]=0;for(ll j=i;j<n;j+=i)(v[j]+=w*(P-inv[j/i])%P)%=P;}ll p=n;GetExp(v,f,n);for(ll i=0;i<n;i++)v[i]=0;GetInv(f,v,n);for(ll i=1;i<=l;i++)printf("%lld\n",v[i]);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319365.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mex性质学习

E.Complicated Computations 如果一个区间的mexamexamexa&#xff0c;满足以下条件&#xff1a; 区间未出现aaa区间出现1→a−11\to a-11→a−1 因此若考虑是否存在一个区间的mex值是aaa&#xff0c;我们尝试把整个区间以aaa为端点划分成若干段&#xff0c;只要每一段内&…

Cows

题目 题意: 有一群牛&#xff0c;每个牛有两个属性值[S,E]&#xff0c;如果牛i和牛j属性值满足Si < Sj 且 Ej < Ei 且 Ei - Si > Ej - Sj&#xff0c;牛i比牛j强壮&#xff0c;输出每个牛比自己强壮的牛的数量。 题解&#xff1a; 我们可以把[S,E]看作坐标&#x…

【SAM】差异(P4248)

正题 P4248 题目大意 设TiT_iTi​为第i个字符开始的后缀&#xff0c;求&#xff1a; ∑i1n∑ji1nlen(Ti)len(Tj)−2lcp(Ti,Tj)\sum_{i1}^n \sum_{ji1}^n len(T_i)len(T_j)-2\times lcp(T_i,T_j)i1∑n​ji1∑n​len(Ti​)len(Tj​)−2lcp(Ti​,Tj​) 解题思路 用SAM建立paren…

P4345-[SHOI2015]超能粒子炮·改【Lucas定理,类欧】

正题 题目链接:https://www.luogu.com.cn/problem/P4345 题目大意 TTT组询问&#xff0c;给出n,kn,kn,k求 ∑i0k(ni)\sum_{i0}^{k}\binom{n}{i}i0∑k​(in​) 对233323332333取模的值 1≤T≤105,1≤k≤n≤10181\leq T\leq 10^5,1\leq k\leq n\leq 10^{18}1≤T≤105,1≤k≤n≤1…

AServer - 基于Asp.net core Kestrel的超迷你http服务器

AServer是基于ASP.NET Core Kestrel封装的一个超迷你http服务器。它可以集成进你的Core程序里&#xff0c;用来快速的响应Http请求&#xff0c;而不需要集成整个ASP.NET Core MVC 框架。一&#xff1a;什么是ASever&#xff1f;AServer就像它的名字一样&#xff0c;Just a serv…

特征根是复数的二阶微分方程

考虑如下微分方程d2ydx2a1dydxa2x0\frac{d^2y}{dx^2}a_1\frac{dy}{dx}a_2x0dx2d2y​a1​dxdy​a2​x0 众所周知&#xff0c;一般求得二阶常系数线性微分方程的通常由以下步骤 根据微分方程写出它的特征方程λ2a1λa20\lambda^2a_1\lambdaa_20λ2a1​λa2​0求解特征方程的两个…

Buy and Resell 2018中国大学生程序设计竞赛 - 网络选拔赛

题目 题意&#xff1a; n个宝石&#xff0c;宝石的买入或卖出价格固定&#xff0c;一天只能到一个珠宝商店&#xff08;从左到右&#xff09;&#xff0c;问最大利润是多少&#xff1f;在保证最大利润的同时最少交换次数是多少&#xff1f; 题解&#xff1a; 题目有两问&am…

基于Service fabric + Ocelot + Identity Server4 + 52ABP 的案例展示

10.24-27 大会Microsoft Tech Summit 2018 在上海举办&#xff0c;我 有幸受邀成为这场大会的讲师。Microsoft Tech Summit 2018 微软技术暨生态大会将于10月24日至27日在上海世博中心举行&#xff0c;这也会是国内举办的最后一届 Tech Summit&#xff0c;2019 年开始会以 Micr…

【网络流】植物大战僵尸(P2805)

正题 P2805 题目大意 在一个nmn\times mnm的平面上有若干植物&#xff0c;每个植物有其攻击集合&#xff0c;吃掉一个植物要先吃掉该植物右边的所有植物&#xff0c;且该植物不能在任何一个植物的攻击集合内&#xff0c;吃掉后有贡献ai,ja_{i,j}ai,j​&#xff0c;问你最大贡…

YbtOJ#763-攻城略池【线段树合并】

正题 题目链接:http://www.ybtoj.com.cn/problem/763 题目大意 给出nnn个点的一棵树&#xff0c;每个di0d_i0di​0的点每秒会产生一个士兵往根节点走&#xff0c;走到一个节点让一个节点did_idi​减一&#xff08;为000就不管&#xff09;。 求需要多久才能让所有点的ddd值变…

ARC106——E - Medals

E - Medals 首先看到这题看不出是一个匹配的题大佬题解 把每一个工人和每一天看成一个二分图&#xff0c;如果某个工人在某天工作&#xff0c;那么两者存在边&#xff0c;现在问题转化成至少需要多少天&#xff0c;能够把nnn个工人全部匹配kkk次 显然天数可以二分&#xff0…

2020 CCPC网络赛 赛后感

第一次参加&#xff0c;做过去年19年网络赛的题&#xff0c;去年是四个水题稳做出&#xff0c;然后还有两个线段树和树状数组的题&#xff08;好像是&#xff09;&#xff0c;所以本来对这次网络赛挺有信心的&#xff08;去年好像四个题就能进,当然要手速快&#xff09;。 这次…

Feature Flag 功能发布控制

背景产品在新功能发布前&#xff0c;可能会采取小流量测试的方式&#xff0c;或者在确定方案前使用A/B测试来衡量。一般开发人员会跟运维同学合作&#xff0c;通过一些现有平台切换机器或者流量来实现。本文介绍了另外一种简便的方式&#xff0c;并解释了其在持续集成上的应用&…

P4542-[ZJOI2011]营救皮卡丘【费用流,Floyd】

正题 题目链接:https://www.luogu.com.cn/problem/P4542 题目大意 给出n1n1n1个点mmm条边的无向图&#xff0c;kkk个人开始在000号点&#xff0c;一个人进入iii号点之前必须要有人经过i−1i-1i−1号点&#xff0c;求第一个人进入nnn号点时所有人的最短移动距离和。 1≤n≤150…

【线段树】GSS5 - Can you answer these queries V(luogu-SPOJ 2916)

正题 luogu-SPOJ 2916 题目大意 给你一个序列&#xff0c;有若干询问&#xff0c;每次给出左右端点的区间&#xff0c;问你最大字段和 解题思路 用线段树维护区间信息&#xff0c;询问的区间如果有交则分类讨论求解 code #include<cstdio> #include<cstring> #…

SmartSql 动态代理仓储

SmartSql源码&#xff1a;https://github.com/Ahoo-Wang/SmartSql1|1简介动态代理仓储(SmartSql.DyRepository)组件是SmartSql非常独特的功能&#xff0c;它能简化SmartSql的使用。对业务代码除了配置几乎没有侵入。可以说使用SmartSqlContainer是原始方法&#xff0c;而DyRepo…

HDU 6889 Graph Theory Class(CCPC网络赛)

hdu 6889 传说中的人均min25 题意&#xff1a; n个点的完全图&#xff0c;边权为lcm(i1,j1)&#xff0c;求mst&#xff08;最小生成树&#xff09; 题解&#xff1a; 我一开始以为是推公式&#xff0c;毕竟数据范围这么大&#xff0c;但是自己画图来看看mst的情况 注意求lc…

Ocelot简易教程(六)之重写配置文件存储方式并优化响应数据

本来这篇文章在昨天晚上就能发布的&#xff0c;悲剧的是写了两三千字的文章居然没保存&#xff0c;结果我懵逼了。今天重新来写这篇文章。今天我们就一起来探讨下如何重写Ocelot配置文件的存储方式以及获取方式。作者&#xff1a;依乐祝原文地址&#xff1a;https://www.cnblog…

【线段树】蝴蝶与花(P6859)

正题 P6859 题目大意 给你一个由1,2组成的序列&#xff0c;要求完成写下列操作&#xff1a; 修改一个数查找一段区间&#xff0c;使其区间和为s&#xff08;输出左端点最小的一组&#xff09; 解题思路 用线段树来维护该序列&#xff0c;对于每次查询&#xff0c;先找到从1…

YbtOJ#912-神秘语言【结论,欧拉定理】

正题 题目链接:http://www.ybtoj.com.cn/problem/912 题目大意 给出L,RL,RL,R&#xff0c;求有多少长度在[L,R][L,R][L,R]之间的字符串满足依次取出所有偶数位置的放在最前面后&#xff0c;与原字符串相同。字符集是所有小写字母。 1≤Q≤5,1≤L≤R≤1010,R−L≤51041\leq Q\…