UVa 11859 (Nim) Division Game

把每一行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\n", kase, xorsum ? "YES" : "NO");

40     }

41 

42     return 0;

43 }
代码君

 

你可能感兴趣的:(visio)