NIM游戏

这是一个NIM游戏,可以直接通过判断异或操作判断序列{a1,a2,...,an}是否为p-positon(即 a1^a2^...^an),不过因为1=<n<=10^5, mi<=10^16,导致参与异或运算的数会特别多,可以通过(n*4)^(n*4+1)^(n*4+2)^(n*4+3) = 0  ,n属于N。来进行计算优化。

实现代码如下:

 1 import java.util.Scanner;
 2 
 3 public class Main {
 4 
 5     public static long xor_fn(long val, long l) {
 6         long ans = 0;
 7         for (int i = 0; i < l; i++) {
 8             ans ^= (val + i);
 9         }
10         return ans;
11     }
12 
13     public static void main(String[] args) {
14         Scanner scan = new Scanner(System.in);
15         
16         while (scan.hasNext()) {
17             int n = scan.nextInt();
18             long grundy = 0;
19             for (int i = 0; i < n; i++) {
20                 long ans = 0;
21                 long x = scan.nextLong();
22                 long m = scan.nextLong();
23                 if (m > 6) {
24                     long y = x + m - 1, var = 0, var1 = 0;
25                     if (x % 4 != 0) {
26                         long t = 0;
27                         if (x % 4 == 1)
28                             t = 3;
29                         else if (x % 4 == 2)
30                             t = 2;
31                         else if (x % 4 == 3)
32                             t = 1;
33                         var = xor_fn(x, t);
34                     }
35                     if (y % 4 != 3) {
36                         long k = y % 4 + 1;
37                         var1 = xor_fn(y - k + 1, k);
38                     }
39                     ans = var ^ var1;
40                 } else {
41                     ans = xor_fn(x, m);
42                 }
43                 grundy ^= ans;
44             }
45             System.out.println(((grundy > 0) ? "first" : "second"));
46         }
47         scan.close();
48     }
49 
50 }

 

转载于:https://www.cnblogs.com/jade640/p/6765747.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值