把每一行m个数所有的素因子看做一堆,就把问题转化为n堆的Nim游戏。
然后预处理一下10000以内每个数素因数的个数,再根据书上的Bouton定理,计算一下n行素因数个数的异或和。
为0是先手必败局面,输出NO,否则输出YES
1 #include <cstdio> 2 #include <cmath> 3 4 const int maxp = 10000; 5 int f[maxp + 10]; 6 7 int main() 8 { 9 //freopen("in.txt", "r", stdin); 10 11 for(int i = 2; i <= maxp; i++) if(!f[i]) 12 { 13 int t = i; 14 while(t <= maxp) 15 { 16 for(int j = t; j <= maxp; j += t) f[j]++; 17 t *= i; 18 } 19 } 20 21 int T; 22 scanf("%d", &T); 23 for(int kase = 1; kase <= T; ++kase) 24 { 25 int n, m; 26 scanf("%d%d", &n, &m); 27 int xorsum = 0; 28 for(int i = 0; i < n; i++) 29 { 30 int cnt = 0; 31 for(int j = 0; j < m; j++) 32 { 33 int x; 34 scanf("%d", &x); 35 cnt += f[x]; 36 } 37 xorsum ^= cnt; 38 } 39 printf("Case #%d: %s ", kase, xorsum ? "YES" : "NO"); 40 } 41 42 return 0; 43 }