[BZOJ3771]Triple

不同情况的生成函数

我们先设𝑎(𝑥)为丢失一把斧头的生成函数,𝑏(𝑥)为丢失两把一样的斧头的生成函数,𝑐(𝑥)为丢失三把一样的斧头的生成函数

对于样例来说:

𝑎(𝑥)=𝑥4+𝑥5+𝑥6+𝑥7𝑏(𝑥)=𝑥8+𝑥10+𝑥12+𝑥14𝑐(𝑥)=𝑥12+𝑥15+𝑥18+𝑥21

再设𝐴(𝑥)为丢失一把斧头的生成函数,𝐵(𝑥)为丢失两把不同的斧头的生成函数,𝐶(𝑥)为丢失三把不同的斧头的生成函数

对于样例来说:

𝐴(𝑥)=𝑎(𝑥)𝐵(𝑥)=𝑎2(𝑥)𝑏(𝑥)𝐶(𝑥)=𝑎3(𝑥)3𝑎(𝑥)𝑏(𝑥)+2𝑐(𝑥)

解释一下𝐶(𝑥),首先随意的选择三个斧头(可以相同),然后减去选出两把相同的斧头和另一把斧头(也可以相同),但是三个相同的被减了三次,所以要加2

由于数据范围较大,需要用 FFT 或 NTT 优化

生成函数

注意:

solution-code2593

每种水的生成函数

第 1 种:1+𝑥+𝑥2+=11𝑥

第 2 种:1+𝑥=1𝑥21𝑥

第 3 种:1+𝑥+𝑥2+𝑥3+𝑥4=1𝑥51𝑥

第 4 种:1+𝑥5+𝑥10+=11𝑥5

第 5 种:1+𝑥2+𝑥4+=11𝑥2

乘在一起得到:1(1𝑥)3=(1𝑥)3

带入广义二项式定理得:𝑓(𝑥)=𝑖=0𝐶𝑖𝑖+2𝑥𝑖

𝑖=𝑛时第𝑛项为𝑥𝐶𝑛𝑛+2𝑥𝑛=𝐶2𝑛+2𝑥𝑛

所以答案就为ans=(𝑛+1)(𝑛+2)2

solution-code4763

每种食物的生成函数

汉堡:1+𝑥2+𝑥4+=11𝑥2

可乐:1+𝑥=1𝑥21𝑥

鸡腿:1+𝑥+𝑥2=1𝑥31𝑥

蜜桃多:𝑥+𝑥3+𝑥5+=𝑥1𝑥2

鸡块:1+𝑥4+𝑥8+=11𝑥4

包子:1+𝑥+𝑥2+𝑥3=1𝑥41𝑥

土豆片炒肉:1+𝑥=1𝑥21𝑥

面包:1+𝑥3+𝑥6+=11𝑥3

乘在一起得到:𝑓(𝑥)=𝑥(1𝑥)4=𝑥(1𝑥)4

带入广义二项式定理得𝑓(𝑥)=𝑥𝑖=0𝐶𝑖𝑖+3𝑥𝑖

𝑖=𝑛1时第𝑛1项为𝑥𝐶𝑛𝑛+2𝑥𝑛=𝐶3𝑛+2𝑥𝑛

所以答案就为ans=𝑛(𝑛+1)(𝑛+2)6

[BZOJ3759] Hungergame

转载自joyouth

首先我们不难看出如果存在一个异或和为0的子集,那么先手必胜,否则先手必败

证明如下:

  1. 首先如果至少存在一个异或和为0的子集,那么一定存在一个异或和为0的子集使得选取之后剩下的数的任意子集异或和不为0
  2. 假设我们已经选取了一个异或和为0的子集,无论后手怎么做,我们总是有办法使得当前选取的子集异或和为0,因为后手无论是拿石子还是取石子之后,当前子集异或和不等于0,根据 Nim 游戏可知,此时先手一定有方案使得异或和为0

至此,我们证明了如果至少存在一个异或和为0的子集,先手必胜

那么题目就转化为求是否存在一个子集异或和为0,用线性基即可