题意:
给出n个数字的集合;
然后每次可以从中去两个数a和b ,要求这两个的差(大-小)是集合里没有,并把a-b放进数组;
谁最后没有数字可以取就输了;
问先手赢还是先手输;
思路:
首先求所有数字的最大公约数g,和所有数字中的最大值m;
比如最大公约数是2,比如原先数组是2,6,8
那么集合只可能出现2,4,6,8;
同样如果集合的最大公约数是3
那么集合只可能出现3,6,9,12.......
那么m/g就是这个集合最终可以有几个数字;
减掉原有的n个,就是还可以放进去几个;
判断一下奇偶性就知道先手是输是赢了;
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N = 1005; int n, num[N]; int gcd(int x, int y) { return y == 0 ? x :gcd (y, x % y); } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d",&n); scanf("%d",&num[0]); int g = num[0]; int m = num[0]; for(int i = 1; i < n; i++) { scanf("%d",&num[i]); g = gcd(g,num[i]); m = max(m, num[i]); } if(((m/g) - n) % 2) printf("Win\n"); else printf("Lose\n"); } }
时间: 2024-11-03 21:49:02