HDU 1517 A Multiplication Game

题意:开始的时候p=1,2个人轮流对p进行操作,每次操作中,他们可以选择把p乘上一个数,这个数的范围是2-9。现在的问题是,给你一个n,两人轮流操作,谁先把p操作到p>=n谁就获胜,两人都采用最优策略,问谁获胜。

根据给定的n,可以找出一些必胜、必败的区间。不如说给出的n是162,那么必败的区间是[18,161],必胜的区间是[9,17]。显然先手一次就可以把p的值直接变成9,所以先手可以获胜。然后去递推这些区间就行了,直到递推到区间左边的值为小于10的数。然后判断一下这个区间是必胜的还是必败的区间,被谁取到就可以了。

 1 #include <iostream>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     long long int x;
 7     while(cin>>x){
 8         int cnt = 0,tmp;
 9         while(x >= 10){
10             cnt++;
11             if(cnt&1)  tmp = 9;
12             else       tmp = 2;
13             int t = x % tmp;
14             x /= tmp;
15             if(t)   x++;
16             //cout<<"x="<<x<<endl;
17         }
18         if(cnt%2 == 0 || (cnt%2 == 1 && x >= 3))   cout<<"Stan wins.
";
19         else    cout<<"Ollie wins.
";
20     }
21     return 0;
22 }
View Code
原文地址:https://www.cnblogs.com/zhexipinnong/p/3413221.html