Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 39835 | Accepted: 13436 |
Description
Input
Output
Sample Input
2 1 8 4 4 7
Sample Output
0 1 0
思路:由于之前不了解威佐夫博奕,看到这题后,我就试着推必胜点,首先我就把取石子这个过程看作是在棋盘上走,取第一堆(数目n)的石子就在x轴上走,取第二堆(数目m) 的石子就在y轴上走。所以我们就可以知道x=n,y=m,x=y这三条仙上的点是必胜点(除了x==n&&y==m点 ),然后那么点(n-2,m-1)和(n-1,m-2)点就是必败点,然后又把这些点看成终点,按照之前的思路继续求。 按着这个思路就可以找到(n-1,m-2)(n-2,m-1) (n-3,m-5) (n-4,m-7) (n-5,m-3) (n-6,m-10) (n-7,m-4) (n-8,m-13).......
把n和m去掉就是点 并且使得下x>y 就可以得到一些坐标(0,0)(1,2) (3,5) (4,7) (6,10) (8,13)
到了这个时候我就试着去找规律了
然后就发现了 ak=mes,bk=ak+k // mes表示的是前面没有坐标中没有出现的最小的自然数
最开始(0,0)的是必败点
然后 根据公式
k=1时 a1=1 b1=a1+k=2
k=2 a2=3 b2=a2+2=5
k=3 a3=4 b3=a3+3=7
k=4 a4=6 b4=a4+4=10
...............
然而到这里了我还是不会把这个规律用式子表示出来,僵持之下 只有去找题解了。
然后很神奇的发现原来这就是威佐夫博奕,
机智的威佐夫博奕居然把这个式子给弄出来了, ak=(k*(sqrt(5)+1)/2) bk=ak+k
神奇,居然涉及到黄金分割线
代码
#include<stdio.h>
#include<math.h>
int main() {
int n, m;
while(scanf("%d%d",&n,&m)!=EOF){
if(n>m){
n^=m;
m^=n;
n^=m;
}
double k=m-n;
int t=(k*(sqrt(5.0)+1)/2);
if(t==n) printf("0\n");
else printf("1\n");
}
}