ARC072 D Alice&Brown 博弈论

~~~题面~~~

题解:

  题目大意:有2堆石子数分别为x, y的石子,你每次可以从中间的某一堆中取出2i个石子,扔掉i个,并把剩下的i个放到另一堆,无法操作的人就输了。

  现在给定x,y,判断先手必赢还是先手必输。

  表示这题推出了一个性质,,,然后,,,就没有然后了。

  看题解还是比较妙的。

  结论:如果$|x - y| <= 1$那么后手必赢,反之先手必赢。

  证明:

    假设现在有$|x - y| le 1$,我们不妨设$x > y$,那么$y = x - k$.所以如果我们从x中拿出2i个石子,那么x,y将变为:

    $x' = x - 2i$   $y' = x - k + i$

    这时我们可以发现$y' - x' = -k + 3i$,因为i是非负的,而k因为$|x - y| le 1$,所以$k le 1$,所以3i的大小至少为3,而k最大为1,所以$y' - x'$至少为2,那么这个时候后手一定可以移动。

    现在来考虑后手怎么动:

    首先我们可以推出一个性质,当一开始的石子数为x , y时,先手取了一步变成了$x - 2i$和$y + i$,这个时候后手只需要从y中拿同样的2i个,就可以使得石子数变为$x - i$和$y - i$,而我们知道,两个数同时减去同一个数,它们的差是不会变化的,所以这个时候的$x'$和$y'$依然相差小于等于1,这就转化成了第一种情况

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define R register int
 4 #define LL long long
 5 
 6 LL x, y;
 7 void work()
 8 {
 9     scanf("%lld%lld", &x, &y);
10     if(abs(x - y) <= 1) printf("Brown
");
11     else printf("Alice
"); 
12 }
13 
14 int main()
15 {
16     freopen("in.in", "r", stdin);
17     work();
18     fclose(stdin);
19     return 0;
20 }
View Code
原文地址:https://www.cnblogs.com/ww3113306/p/9819252.html