好久没更博了

咕咕咕

现在多项式板子的常数巨大...周末好好卡波常吧....

LOJ #556


题意

给定$ m$种物品的出现次数$ B_i$以及大小$ A_i$

求装满大小为$[1..n]$的背包的方案数各是多少

数据范围全是$ 10^5$


$ Solution$

转化成生成函数求解

即是要求

$Ans=\prod\limits_{i=1}^m \sum\limits_{j=0}^{B_i} x^{A_i·j}$

等比数列收敛一下即是

$Ans= \prod\limits_{i=1}^m \frac{1-x^{(B_i+1)·A_i}}{1-x^{A_i}}$

直接乘复杂度巨大,考虑转求$ Ln(Ans)$

则有

$Ans=Exp(\sum\limits_{i=1}^m Ln(1-x^{(B_i+1)·A_i})-Ln(1-x^{A_i}))$

其中$ Ln(1-x)$的泰勒级数为$-\sum\limits_{i=1}^{\infty}\frac{x^i}{i}$

开个桶对所有指数记录一下,读入完成后调和级数累加即可

然后就是多项式$ Exp$的模版了

时间复杂度$ O(n \ log \ n)$


$ my \ code$

  1. #include<ctime>
  2. #include<cmath>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<iostream>
  6. #include<algorithm>
  7. #include<queue>
  8. #include<vector>
  9. #define rt register int
  10. #define ll long long
  11. using namespace std;
  12. namespace fast_IO{
  13. const int IN_LEN=,OUT_LEN=;
  14. char ibuf[IN_LEN],obuf[OUT_LEN],*ih=ibuf+IN_LEN,*oh=obuf,*lastin=ibuf+IN_LEN,*lastout=obuf+OUT_LEN-;
  15. inline char getchar_(){return (ih==lastin)&&(lastin=(ih=ibuf)+fread(ibuf,,IN_LEN,stdin),ih==lastin)?EOF:*ih++;}
  16. inline void putchar_(const char x){if(oh==lastout)fwrite(obuf,,oh-obuf,stdout),oh=obuf;*oh++=x;}
  17. inline void flush(){fwrite(obuf,,oh-obuf,stdout);}
  18. }
  19. using namespace fast_IO;
  20. //#define getchar() getchar_()
  21. //#define putchar(x) putchar_((x))
  22. inline ll read(){
  23. ll x=;char zf=;char ch=getchar();
  24. while(ch!='-'&&!isdigit(ch))ch=getchar();
  25. if(ch=='-')zf=-,ch=getchar();
  26. while(isdigit(ch))x=x*+ch-'',ch=getchar();return x*zf;
  27. }
  28. void write(ll y){if(y<)putchar('-'),y=-y;if(y>)write(y/);putchar(y%+);}
  29. void writeln(const ll y){write(y);putchar('\n');}
  30. int k,m,n,x,y,z,cnt,ans;
  31.  
  32. namespace poly{
  33. #define p 998244353
  34. vector<int>R;
  35. vector<int>get(int n){
  36. vector<int>ret(n);
  37. for(rt i=;i<n;i++)ret[i]=read();
  38. return ret;
  39. }
  40. void print(const vector<int>A){for(auto i:A)write((i+p)%p),putchar(' ');}
  41. int ksm(int x,int y=p-){
  42. int ans=;
  43. for(rt i=y;i;i>>=,x=1ll*x*x%p)if(i&)ans=1ll*ans*x%p;
  44. return ans;
  45. }
  46. void NTT(int n,vector<int>&A,int fla){
  47. A.resize(n);
  48. for(rt i=;i<n;i++)if(i>R[i])swap(A[i],A[R[i]]);
  49. for(rt i=;i<n;i<<=){
  50. int w=ksm(,(p-)//i);
  51. for(rt j=;j<n;j+=i<<){
  52. int K=;
  53. for(rt k=;k<i;k++,K=1ll*K*w%p){
  54. int x=A[j+k],y=1ll*K*A[i+j+k]%p;
  55. A[j+k]=(x+y)%p,A[i+j+k]=(x-y)%p;
  56. }
  57. }
  58. }
  59. if(fla==-){
  60. reverse(A.begin()+,A.end());
  61. int invn=ksm(n);
  62. for(rt i=;i<n;i++)A[i]=1ll*A[i]*invn%p;
  63. }
  64. }
  65. vector<int>Resize(int n,vector<int>A){A.resize(n);return A;}
  66. vector<int>Mul(vector<int>x,vector<int>y){
  67. int lim=,sz=x.size()+y.size()-;
  68. while(lim<=sz)lim<<=;R.resize(lim);
  69. for(rt i=;i<lim;i++)R[i]=(R[i>>]>>)|(i&)*(lim>>);
  70. NTT(lim,x,);NTT(lim,y,);
  71. for(rt i=;i<lim;i++)x[i]=1ll*x[i]*y[i]%p;
  72. NTT(lim,x,-);x.resize(sz);
  73. return x;
  74. }
  75. vector<int>Inv(vector<int>A,int n=-){
  76. if(n==-)n=A.size();
  77. if(n==)return vector<int>(,ksm(A[]));
  78. vector<int>b=Inv(A,(n+)/);
  79. int lim=;while(lim<=n+n)lim<<=;R.resize(lim);
  80. for(rt i=;i<lim;i++)R[i]=(R[i>>]>>)|(i&)*(lim>>);
  81. A.resize(n);NTT(lim,A,);NTT(lim,b,);
  82. for(rt i=;i<lim;i++)A[i]=1ll*b[i]*(2ll-1ll*A[i]*b[i]%p)%p;
  83. NTT(lim,A,-);A.resize(n);
  84. return A;
  85. }
  86. vector<int>Div(vector<int>A,vector<int>B){
  87. int n=A.size(),m=B.size();
  88. reverse(A.begin(),A.end());
  89. reverse(B.begin(),B.end());
  90. A.resize(n-m+),B.resize(n-m+);
  91. int lim=;while(lim<=*(n-m+))lim<<=;R.resize(lim);
  92. for(rt i=;i<lim;i++)R[i]=(R[i>>]>>)|(i&)*(lim>>);
  93. vector<int>ans=Resize(n-m+,Mul(A,Inv(B)));
  94. reverse(ans.begin(),ans.end());
  95. return ans;
  96. }
  97. vector<int>Add(vector<int>A,vector<int>B){
  98. int len=max(A.size(),B.size());A.resize(len);
  99. for(rt i=;i<len;i++)(A[i]+=B[i])%=p;
  100. return A;
  101. }
  102. vector<int>Sub(vector<int>A,vector<int>B){
  103. int len=max(A.size(),B.size());A.resize(len);
  104. for(rt i=;i<len;i++)(A[i]-=B[i])%=p;
  105. return A;
  106. }
  107. vector<int>Mul(int x,vector<int>A){
  108. for(rt i=;i<A.size();i++)A[i]=1ll*A[i]*x%p;
  109. return A;
  110. }
  111. vector<int>deriv(vector<int>A){//求导
  112. for(rt i=;i<A.size();i++)(A[i-]=1ll*A[i]*i%p);
  113. A.pop_back();return A;
  114. }
  115. vector<int>integ(vector<int>A){//积分
  116. A.push_back();
  117. for(rt i=A.size()-;i>=;i--)A[i+]=1ll*A[i]*ksm(i+)%p;
  118. A[]=;return A;
  119. }
  120. vector<int>Ln(const vector<int>A){return integ(Resize(A.size()-,Mul(deriv(A),Inv(A))));}
  121. vector<int>Exp(vector<int>A,int n=-){
  122. if(n==-)n=A.size();
  123. if(n==)return vector<int>(,);
  124. vector<int>A0=Resize(n,Exp(A,(n+)>>));
  125. vector<int>now=Resize(n,Ln(A0));
  126. for(rt i=;i<n;i++)now[i]=(A[i]-now[i])%p;now[]++;
  127. return Resize(n,Mul(A0,now));
  128. }
  129. struct cp{
  130. ll a,b,z;//a+bsqrt(z)
  131. cp operator *(const cp s)const{
  132. return {(1ll*a*s.a%p+1ll*b*s.b%p*z%p)%p,(1ll*a*s.b%p+1ll*b*s.a)%p,z};
  133. }
  134. };
  135. cp ksm(cp x,int y){
  136. cp ans={,,x.z};
  137. for(rt i=y;i;i>>=,x=x*x)if(i&){
  138. ans=x*ans;
  139. }
  140. return ans;
  141. }
  142. int Sqrt(int n){//求二次剩馀
  143. if(ksm(n,(p-)/)!=)return -;
  144. while(){
  145. x=rand()%p;
  146. if(ksm((1ll*x*x%p-n%p+p)%p,(p-)/)==)continue;
  147. cp ret=ksm({x,,(1ll*x*x%p+p-n)%p},(p+)/);
  148. return min(ret.a,p-ret.a);
  149. }
  150. }
  151. vector<int>GetSqrt(vector<int>A,int n=-){
  152. if(n==-)n=A.size();
  153. if(n==)return vector<int>(,Sqrt(A[]));
  154. vector<int>ans=Resize(n,GetSqrt(A,n+>>)),C(A.begin(),A.begin()+n);
  155. return Resize(n,Mul(ksm(),Add(ans,Mul(Inv(ans),C))));
  156. }
  157. vector<int>Pow(vector<int>A,int k){
  158. A[]=;
  159. return Exp(Mul(k,Ln(A)));
  160. }
  161. //#undef p
  162. };
  163. using namespace poly;
  164. int inv[],v[];
  165. int main(){
  166. n=read();m=read();
  167. for(rt i=;i<=m;i++){
  168. int a=read(),b=read();
  169. if(1ll*a*(b+)<=n&&b)v[a*(b+)]--;
  170. if(a<=n)v[a]++;
  171. }
  172. inv[]=inv[]=;
  173. for(rt i=;i<=n;i++)inv[i]=1ll*inv[p%i]*(p-p/i)%p;
  174. vector<int>ans(n+);
  175. for(rt i=;i<=n;i++)if(v[i])
  176. for(rt j=;i*j<=n;j++)(ans[i*j]+=1ll*v[i]*inv[j]%p)%=p;
  177. ans=Exp(ans);
  178. for(rt i=;i<=n;i++)writeln((ans[i]+p)%p);
  179. return flush(),;
  180. }

LOJ #556. 「Antileaf's Round」咱们去烧菜吧的更多相关文章

  1. 【刷题】LOJ 556 「Antileaf's Round」咱们去烧菜吧

    题目描述 你有 \(m\) 种物品,第 \(i\) 种物品的大小为 \(a_i\) ​,数量为 \(b_i\)​( \(b_i=0\) 表示有无限个). 你还有 \(n\) 个背包,体积分别为 \(1 ...

  2. 「LOJ 556 Antileaf's Round」咱们去烧菜吧

    「LOJ 556 Antileaf's Round」咱们去烧菜吧 最近在看 jcvb 的生成函数课件,顺便切一切上面讲到的内容的板子题,这个题和课件上举例的背包计数基本一样. 解题思路 首先列出答案的 ...

  3. LOJ#557. 「Antileaf's Round」你这衣服租来的吗(FHQ Treap+珂朵莉树)

    题面 传送门 题解 好吧我是不太会复杂度分析-- 我们对于每种颜色用一个数据结构维护(比方说线段树或者平衡树,代码里写的平衡树),那么区间询问很容易就可以解决了 所以现在的问题是区间修改,如果区间颜色 ...

  4. loj558 「Antileaf's Round」我们的CPU遭到攻击

    考完了可以发题解了. 做法是link-cut tree维护子树信息,并不需要维护黑树白树那些的. 下面是一条重链: 如果4是根的话,那么在splay上是这样的: 在splay中,子树的信息都已经计算完 ...

  5. Loj #2331. 「清华集训 2017」某位歌姬的故事

    Loj #2331. 「清华集训 2017」某位歌姬的故事 IA 是一名会唱歌的女孩子. IOI2018 就要来了,IA 决定给参赛选手们写一首歌,以表达美好的祝愿.这首歌一共有 \(n\) 个音符, ...

  6. Loj #2324. 「清华集训 2017」小 Y 和二叉树

    Loj #2324. 「清华集训 2017」小 Y 和二叉树 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙上, ...

  7. Loj #2321. 「清华集训 2017」无限之环

    Loj #2321. 「清华集训 2017」无限之环 曾经有一款流行的游戏,叫做 *Infinity Loop***,先来简单的介绍一下这个游戏: 游戏在一个 \(n \times m\) 的网格状棋 ...

  8. Loj 2320.「清华集训 2017」生成树计数

    Loj 2320.「清华集训 2017」生成树计数 题目描述 在一个 \(s\) 个点的图中,存在 \(s-n\) 条边,使图中形成了 \(n\) 个连通块,第 \(i\) 个连通块中有 \(a_i\ ...

  9. 【刷题】LOJ 6227 「网络流 24 题」最长k可重线段集问题

    题目描述 给定平面 \(\text{xoy}\) 上 \(n\) 个开线段组成的集合 \(\text{I}\) ,和一个正整数 \(k\) ,试设计一个算法. 从开线段集合 \(\text{I}\) ...

随机推荐

  1. keras 的 Deeplabv3+ 实现遇到的问题

    代码大佬都已经写好了,具体参考:https://github.com/bonlime/keras-deeplab-v3-plus git clone 下来以后,按照指南要训练自己的数据集,只要设置好自 ...

  2. FineUI十周年纪念版即将发布(基于像素的响应式布局,独此一家)!

    [新版预报]FineUI十周年纪念版(v5.0.0)即将于2018-04-23发布! 官网示例已更新:http://pro.fineui.com/ 特别助攻:基于像素的响应式布局,FineUI独家秘笈 ...

  3. 周末学习笔记——day01(函数,函数对象,嵌套调用,名称空间,作用域,闭包,装饰器)

    一,复习 字符编码 文件头:py2—ASCII,py3—UTF-8 三种字符串:u' ' b ' ' r ' ' u' ' .endcode(' utf-8 ') b' '.deconde(' utf ...

  4. PyQt5基础应用一

    一.PyQt5基础   1.1 创建窗口 import sys from PyQt5.QtWidgets import QApplication, QWidget if __name__ == '__ ...

  5. 【学习总结】GirlsInAI ML-diary day-13-Try/Except 异常处理

    [学习总结]GirlsInAI ML-diary 总 原博github链接-day13 认识异常处理 要点小结: try和except是同个等级,注意对齐和缩进 可以把try和except直接理解成另 ...

  6. Kubernetes(基础 一):进程

    容器其实是一种沙盒技术.顾名思义,沙盒就是能够像一个集装箱一样,把你的应用“装”起来的技术.这样,应用与应用之间,就因为有了边界而不至于相互干扰:而被装进集装箱的应用,也可以被方便地搬来搬去,这不就是 ...

  7. Vue中Vuex的详解与使用(简洁易懂的入门小实例)

    怎么安装 Vuex 我就不介绍了,官网上有 就是 npm install xxx 之类的.(其实就是懒~~~哈哈) 那么现在就开始正文部分了 众所周知 Vuex 是什么呢?是用来干嘛的呢? Vuex ...

  8. DAY11、函数总结

    一.函数的对象 1.函数对象:函数名存放的就是函数的地址,所以函数名也是对像 2.函数对象的应用: 2.1.可以直接被引用   fn = cp_fn 2.2.可以当作函数参数传递    compute ...

  9. mysql-笔记-数据类型

    https://dev.mysql.com/doc/refman/5.7/en/numeric-type-overview.html serial: SERIAL is an alias for BI ...

  10. CCProxy使用说明

    CCProxy:通过手机调试webservice工具 第一步配置,点击设置 弹出如下页面点击E 弹出如下页面 配置端口,点击确定配置完成!! c#项目在路径为DCYS\.vs\config下找到文件a ...