HDU 1517

这道题真的是想了很久,一直束缚在SG函数上了,殊不知有的时候寻找P-position和N-position的规律更加方便。看了大牛的代码,寻找必胜区间,还有就是&位运算把自己搞糊涂了,惭愧。。。。以后判断奇偶数还是用%的好。。。

转自:http://blog.pfan.cn/cruxd/22157.html

 这题好X难。

    题目大概意思是:两人轮流乘一个2-9的数,从1开始乘,求谁的乘积先大于N。

    如果是加法就好做了。凑到剩下的数能整除11,然后对称着加。问题是乘法。

    所以寻找必胜点(段)。以1000为例。

    1000 | 999 ... 112 |    若占住999到112,则对手必胜。必须让对手占领此段。

    1000 | 999 ... 112 | 111 ... 56 |   因此必占段是 111 -? 。如果56被对手占住,则56×2=112,入必败段。问题转化成为占56。

    如此循环。如下 1000 | 999 ... 112 | 111 ... 56 | 55 ... 7 | 6 ... 4 | 3 ... 1

   仔细考虑端点,我在处理端点情况时想了好久。

    这是我的代码。

View Code
 1 /*
2 * AUthor:lonelycatcher
3 * problem:hdu 1517
4 * Type:博弈
5 */
6 #include <iostream>
7 #include<stdio.h>
8 #include<cstdlib>
9 using namespace std;
10 long long n;
11 int main()
12 {
13 setbuf(stdout,NULL);
14 while(cin>>n)
15 {
16 if(n==1)
17 {
18 printf("Stan wins.\n");
19 continue;
20 }
21 int steps=0;
22 while(n>1)
23 {
24 steps++;
25 if(steps&1)
26 {
27 n=(n-1)/9+1;
28 }
29 else n=(n+1)/2;
30 }
31 if(steps&1)printf("Stan wins.\n");
32 else printf("Ollie wins.\n");
33 }
34 return 0;
35 }

posted on 2011-08-20 20:44  lonelycatcher  阅读(873)  评论(0编辑  收藏  举报

导航