[BZOJ3771]Triple(快速傅里叶变换FFT)

博客通过一个物品价值组合的问题介绍了如何运用快速傅里叶变换(FFT)解决组合计数问题。通过生成函数和容斥原理,解释了如何构建并处理多项式,避免重复计数,最终得出正确答案的公式:Ans=F(x)1!+F2(x)−B(x)2!+F(x)3−3F(x)B(x)+2C(x)3!
摘要由CSDN通过智能技术生成

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

【输入】
第一行是整数N,表示有N个物品
接下来n行升序输入N个数字Ai,表示每个物品的价值。

【输出】
若干行,按升序对于所有可能的总价值输出一行x y,x为价值,y为方案数。

【样例输入】
4
4
5
6
8

【样例输出】
4 1
5 1
6 1
8 1
9 1
10 1
11 1
12 1
13 1
14 1
15 1
17 1
18 1
19 1

引用ATP酱的话

要求所有组合的方案数,并且还要求具体组合出来的方案,可以想到利用生成函数

先简单说一下生成函数,生成函数其实就是一个多项式,对于这一题我们可以把多项式中x的指数看成斧头的价格,x的系数看成斧头的数量,那么这样有什么用呢,我们举一个例子来说明,比如说我有2个价值为5的斧头,1个价值为7的斧头
那么他们的多项式分别表示为 2x5 x7 那么把两个多项式乘起来,得到 2x12 ,因为乘法的时候指数相加,系数相乘,那么得到的这个多项式的系数就是选他们两个他们的方案数,指数就是选他们两个的损失。

我们设拿一个斧头的生成函数为 F(x)
根据生成函数的定义,那么拿两个,三个的生成函数就为 F2(x),F3(x)
那么我们是不是可以理所当然的认为答案就是
F(x)+F2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值