【题意】
给定一个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的奇偶性即可。如果不能呢?