题意: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变系数表示

#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
#include <cmath>
using namespace std;
const int N=+;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
const double PI=acos(-);
struct Vector{
double x,y;
Vector(double a=,double b=):x(a),y(b){}
};
typedef Vector CD;
Vector operator +(Vector a,Vector b){return Vector(a.x+b.x,a.y+b.y);}
Vector operator -(Vector a,Vector b){return Vector(a.x-b.x,a.y-b.y);}
Vector operator *(Vector a,Vector b){return Vector(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);}
Vector operator *(Vector a,double b){return Vector(a.x*b,a.y*b);}
Vector operator /(Vector a,double b){return Vector(a.x/b,a.y/b);}
Vector conj(Vector a){return Vector(a.x,-a.y);} struct FastFourierTransform{
int n,rev[N];
CD omega[N],omegaInv[N];
void ini(int m){
n=;
while(n<m) n<<=;
for(int k=;k<n;k++)
omega[k]=CD(cos(*PI/n*k),sin(*PI/n*k)),
omegaInv[k]=conj(omega[k]);
int k=;
while((<<k)<n) k++;
for(int i=;i<n;i++){
int t=;
for(int j=;j<k;j++) if(i&(<<j)) t|=(<<(k-j-));
rev[i]=t;
}
}
void transform(CD *a,CD *omega){
for(int i=;i<n;i++) if(i<rev[i]) swap(a[i],a[rev[i]]);
for(int l=;l<=n;l<<=){
int m=l>>;
for(CD *p=a;p!=a+n;p+=l)
for(int k=;k<m;k++){
CD t=omega[n/l*k]*p[k+m];
p[k+m]=p[k]-t;
p[k]=p[k]+t;
}
}
}
void DFT(CD *a,int flag){
if(flag==) transform(a,omega);
else{
transform(a,omegaInv);
for(int i=;i<n;i++) a[i].x/=(double)n;
}
}
}fft;
int n,m,w;
CD A[N],B[N],C[N],ans[N];
int main(){
freopen("in","r",stdin);
n=read();
for(int i=;i<=n;i++){
w=read(); m=max(m,w);
A[w].x=;
B[w*].x=;
C[w*].x=;
}
m=m*;
fft.ini(m);
fft.DFT(A,);fft.DFT(B,);fft.DFT(C,); for(int i=;i<fft.n;i++)
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;
fft.DFT(ans,-);
for(int i=;i<m;i++) if(int(ans[i].x+0.5)) printf("%d %d\n",i,int(ans[i].x+0.5));
}

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. 高可用高性能分布式文件系统FastDFS实践Java程序

    在前篇 高可用高性能分布式文件系统FastDFS进阶keepalived+nginx对多tracker进行高可用热备 中已介绍搭建高可用的分布式文件系统架构. 那怎么在程序中调用,其实网上有很多栗子, ...

  2. 用于浏览器桌面通知的Web API 接口 -notification

    notification 接口用于浏览器向用户提供通知内容:常见的如网页版的微信: 1.实现,需要Notifications API 提供的通知接口: 用法: let notification = n ...

  3. SDK是什么?什么是SDK

    从 SDK导航 看到的 应该比较专业! SDK的英文全名是:software development kit,翻译成中文的意思就是"软件开发工具包" 通俗一点的理解,是指由第三方服 ...

  4. git只添加指定类型的文件的.gitignore规则

    #忽略根目录下的所有文件 * #忽略子目录下的所有文件 /* #包含目录 !*/ #指定不忽略的文件 !*.c !*.h #忽略根目录下的文件 /build/ /appveyor/ /pear/ /s ...

  5. 引用类型之数组array最全的详解

    Array类型 今天总结一下array类型. js中的数组是有着非常强大的功能.具有很大的灵活性,有两个方面的特点 1.数组的每一项可以保存任何的数据类型:2.数组大小可以动态的调整:看下面的例子: ...

  6. Spring @Scheduled 在tomcat容器里面执行两次

    今天在用spring里面的@Scheduled执行定时任务,但是发现到触发定时任务的时间点总会执行两次.原因是修改了tomcat conf包下面的server.xml文件导致的.配置如下: <H ...

  7. hdevelop (halcon)处理大分辨率图像问题

    HALCON 的ide有2种模式:hdevelop 和hdevelop xl hdevelop 适用于普通分辨率的图像,小于等于 32k x 32k : hdevelop xl适用于大分辨率的图像,大 ...

  8. Docker部署Elasticsearch集群

    http://blog.sina.com.cn/s/blog_8ea8e9d50102wwik.html Docker部署Elasticsearch集群 参考文档: https://hub.docke ...

  9. 移动端 -webkit-user-select:text; ios10 bug 解决方案

    移动端一般body的css.会设置 作用就不解释了: body{ height:100%;min-height:100%; font-family: "微软雅黑",'Helveti ...

  10. z-index在IE中的坑

    在CSS2.1规范中,每个盒模型的位置是三维的,分别是平面画布上的x轴,y轴以及表示层叠的z轴.对于每个html元素,都可以通过设置z-index属性来设置该元素在视觉渲染模型中的层叠顺序. z-in ...