题意:n个物品,可以用1/2/3个不同的物品组成不同的价值,求每种价值有多少种方案(顺序不同算一种)


【生成函数】:

构造这么一个多项式函数g(x),使得n次项系数为a[n]。

普通型生成函数用于解决多重集的组合问题

生成函数的x无实际意义 通常可以化为一个简单的式子

组合数的生成函数 A(x)=(1+x)^n  C(n,k)=a[k] 可以这么想,一次要么选择1要么选择x,选择x系数就会+1

生成函数系数为方案数,次数为价值

A(x) 选一个

B(x) A每项平方 选两个

C(x) A每项三次方 选三个

然后容斥原理算答案 听好想的看代码吧

注意计算的时候可以一直用点值,最后在再IDFT变系数表示

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <string>
  4. #include <algorithm>
  5. #include <cmath>
  6. using namespace std;
  7. const int N=+;
  8. inline int read(){
  9. char c=getchar();int x=,f=;
  10. while(c<''||c>''){if(c=='-')f=-;c=getchar();}
  11. while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
  12. return x*f;
  13. }
  14. const double PI=acos(-);
  15. struct Vector{
  16. double x,y;
  17. Vector(double a=,double b=):x(a),y(b){}
  18. };
  19. typedef Vector CD;
  20. Vector operator +(Vector a,Vector b){return Vector(a.x+b.x,a.y+b.y);}
  21. Vector operator -(Vector a,Vector b){return Vector(a.x-b.x,a.y-b.y);}
  22. Vector operator *(Vector a,Vector b){return Vector(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);}
  23. Vector operator *(Vector a,double b){return Vector(a.x*b,a.y*b);}
  24. Vector operator /(Vector a,double b){return Vector(a.x/b,a.y/b);}
  25. Vector conj(Vector a){return Vector(a.x,-a.y);}
  26.  
  27. struct FastFourierTransform{
  28. int n,rev[N];
  29. CD omega[N],omegaInv[N];
  30. void ini(int m){
  31. n=;
  32. while(n<m) n<<=;
  33. for(int k=;k<n;k++)
  34. omega[k]=CD(cos(*PI/n*k),sin(*PI/n*k)),
  35. omegaInv[k]=conj(omega[k]);
  36. int k=;
  37. while((<<k)<n) k++;
  38. for(int i=;i<n;i++){
  39. int t=;
  40. for(int j=;j<k;j++) if(i&(<<j)) t|=(<<(k-j-));
  41. rev[i]=t;
  42. }
  43. }
  44. void transform(CD *a,CD *omega){
  45. for(int i=;i<n;i++) if(i<rev[i]) swap(a[i],a[rev[i]]);
  46. for(int l=;l<=n;l<<=){
  47. int m=l>>;
  48. for(CD *p=a;p!=a+n;p+=l)
  49. for(int k=;k<m;k++){
  50. CD t=omega[n/l*k]*p[k+m];
  51. p[k+m]=p[k]-t;
  52. p[k]=p[k]+t;
  53. }
  54. }
  55. }
  56. void DFT(CD *a,int flag){
  57. if(flag==) transform(a,omega);
  58. else{
  59. transform(a,omegaInv);
  60. for(int i=;i<n;i++) a[i].x/=(double)n;
  61. }
  62. }
  63. }fft;
  64. int n,m,w;
  65. CD A[N],B[N],C[N],ans[N];
  66. int main(){
  67. freopen("in","r",stdin);
  68. n=read();
  69. for(int i=;i<=n;i++){
  70. w=read(); m=max(m,w);
  71. A[w].x=;
  72. B[w*].x=;
  73. C[w*].x=;
  74. }
  75. m=m*;
  76. fft.ini(m);
  77. fft.DFT(A,);fft.DFT(B,);fft.DFT(C,);
  78.  
  79. for(int i=;i<fft.n;i++)
  80. ans[i]=ans[i]+A[i]+(A[i]*A[i]-B[i])/2.0+(A[i]*A[i]*A[i]-3.0*A[i]*B[i]+2.0*C[i])/6.0;
  81. fft.DFT(ans,-);
  82. for(int i=;i<m;i++) if(int(ans[i].x+0.5)) printf("%d %d\n",i,int(ans[i].x+0.5));
  83. }

BZOJ 3771: Triple [快速傅里叶变换 生成函数 容斥原理]的更多相关文章

  1. bzoj 3771: Triple 快速傅里叶变换 FFT

    题目大意: 给出\(n\)个互不相同的物品,每个物品有价值\(x_i(x_i \leq 40000)\)如果可以从中取一个或两个或三个物品.问能够组合出来的所有价值和对应的方案数,全部输出.取值时,\ ...

  2. [BZOJ 3771] Triple(FFT+容斥原理+生成函数)

    [BZOJ 3771] Triple(FFT+生成函数) 题面 给出 n个物品,价值为别为\(w_i\)且各不相同,现在可以取1个.2个或3个,问每种价值和有几种情况? 分析 这种计数问题容易想到生成 ...

  3. bzoj 3771: Triple【生成函数+FFT+容斥原理】

    瞎搞居然1A,真是吃鲸 n的范围只有聪明人能看见--建议读题3遍 首先看计数就想到生成函数,列出多项式A(x),然后分别考虑123 对于选一个的直接计数即可: 对于选两个的,\( A(x)^2 \), ...

  4. bzoj 3771 Triple FFT 生成函数+容斥

    Triple Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 847  Solved: 482[Submit][Status][Discuss] Desc ...

  5. BZOJ 3771 Triple FFT+容斥原理

    解析: 这东西其实就是指数型母函数? 所以刚开始读入的值我们都把它前面的系数置为1. 然后其实就是个多项式乘法了. 最大范围显然是读入的值中的最大值乘三,对于本题的话是12W? 用FFT优化的话,达到 ...

  6. BZOJ 3771: Triple(生成函数 FFT)

    Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 911  Solved: 528[Submit][Status][Discuss] Description ...

  7. BZOJ 3771: Triple

    Description 问所有三/二/一元组可能形成的组合. Sol FFT. 利用生成函数直接FFT一下,然后就是计算,计算的时候简单的容斥一下. 任意三个-3*两个相同的+2*全部相同的+任意两个 ...

  8. bzoj 3771 Triple——FFT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3771 把方案作为系数.值作为指数,两项相乘就是系数相乘.指数相加,符合意义. 考虑去重.先自 ...

  9. bzoj 3771 Triple —— FFT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3771 令多项式的系数是方案数,次数是值: 设 a(x) 为一个物品的多项式,即 a[w[i] ...

随机推荐

  1. mybatis sql循环的使用

    foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合. foreach元素的属性主要有 item,index,collection,open,separator,close. ...

  2. SVN版本库修改URL路径或者IP地址

    服务器的IP地址或者URL变更,版本库服务器的IP也要修改,因为当初安装SVN URL没有使用别名,所以使用的人都要修改客户端的IP,以下是参考网上的资料. 1.Windows TortoiseSVN ...

  3. Sublime 安装、插件CoolFormat

    http://www.sublimetext.com/3 安装Package Control https://packagecontrol.io/installation#st3 安装插件Cool F ...

  4. 版本控制——TortoiseSVN (1)安装与配置

    =================================版权声明================================= 版权声明:原创文章 禁止转载  请通过右侧公告中的“联系邮 ...

  5. Hadoop问题:chmod 0700 of directory /var/lib/apt/lists/

    问题描述: apt-get update W: chmod of directory /: Operation not permitted) E: Could not open : Permissio ...

  6. vue学习笔记(二)——简单的介绍以及安装

    学习编程需要的是 API+不断地练习^_^ Vue官网:https://cn.vuejs.org/ 菜鸟教程:http://www.runoob.com/vue2/vue-tutorial.html ...

  7. 【笔记】css 实现宽度自适应屏幕 高度自适应宽度

    如果说宽高自适应屏幕尺寸那么大家可能会想到 div{ width: 100%; height: 100% } 但是如果我要自适应屏幕尺寸的同时还要变成正方形呢?(高度和宽度相等而高度不能写死) 那就要 ...

  8. Netty 拆包粘包和服务启动流程分析

    Netty 拆包粘包和服务启动流程分析 通过本章学习,笔者希望你能掌握EventLoopGroup的工作流程,ServerBootstrap的启动流程,ChannelPipeline是如何操作管理Ch ...

  9. Vue精简版风格指南

    前面的话 Vue官网的风格指南按照优先级(依次为必要.强烈推荐.推荐.谨慎使用)分类,且代码间隔较大,不易查询.本文按照类型分类,并对部分示例或解释进行缩减,是Vue风格指南的精简版 组件名称 [组件 ...

  10. Python的交叉编译移植至arm板

    虽然网上有那么多python的交叉编译移植教程,但是方法差异蛮大,需要根据实际开发板的型号做调整,以下是适用于海思的板子移植过程. step 1. python版本从网上下就可以: step 2. 解 ...