CodeForces 346A(数学题)

【题意】

给定一个N个不同的正数组成的数列,1<N<100,数的范围为[1,10^9]。Alice 和 Bob轮流博弈,每次在数列中选出两个不同的数x和y,使得|x-y|不在数列中,那么加入|x-y|到数列,如果不能操作的人lose。Alice先操作,都采取最优策略,问谁win。

【分析】

0、考虑只有两个数x和y的时候,我们能构造出哪些数?

  a).假如x<y,比如一次操作可以表示为|x-y| = 1*y - 1*x,可以想到以后的每次操作都可以复合地表示ax + by的形式,那么可以构造出gcd(x,y) = ax + by

  b).进而,可以把gcd(x,y)的倍数(小于等于max(x,y))都构造出来。

  c).不能构造其他数了。

  d).任何两个数构成的数列可以把gcd(x,y)和max(x,y)当做他们的代表元

1、这样我们就可以考虑使用归纳法,如果有3个数的时候{x,y,z},我们先考虑x和y,求出gcd(x,y)和max(x,y)再和z进行考虑,gcd(z,gcd(x,y))到max(x,y,z)的gcd(z,gcd(x,y))的倍数都能表示出来。

2、至此,我们应该是可以知道整个给定的数列我们能增加哪些数了,那么最终数列的总数 - n就是我们可以增加的数的个数。判定奇偶性即可。

 

【算法】

1、求出所有数的最大公约数gcd和最大的数max,

2、判定 max/gcd - n 的奇偶性即可。

 

【PS】

比赛的时候这个题目把increase 看错成decrease,理解为把x和y都从数列中减少,然后把|x-y|加入数列中。后面纠结于|x-y|能不能等于x或者y,有歧义。写了个题解WA #4

 

如果是这个问题,那应该怎么做呢?显然如果|x-y|可以等于x或者y,那么做法很简单,直接判定n的奇偶性即可。如果不能呢?

 

转载于:https://www.cnblogs.com/wangsouc/articles/3630188.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值