主题:ZOJ 1893 A Multiplication Game
A multiplication game
Stan and Ollie play the game of multiplication by multiplying an integer p by one of the numbers 2 to 9. Stan always starts with p = 1, does his multiplication, then Ollie multiplies the number, then Stan and so on. Before a game starts, they draw an integer 1 < n < 4294967295 and the winner is who first reaches pn.
当输入为N时,如果Stan在能赢,则说明之前的一轮Ollie无论出多少都不能赢。设当乘积为M且该Ollie发难(设Ollie出p)时,Stan有必赢的策略(不管Ollie出什么,Stan都出9),即
9×M<N,9×p×M≥N (p≥2)
等价于M≥ceil(N / (2×8)) (ceil为向上取整)
下面证明如果Stan在ceil(N/18)时有必赢的策略,则
9×ceil(N/18)<N且18×ceil(N/18)≥N.
设N = 18×k + r (k≥1,0≤r<18)代人上式即得。
(在10到18之间,Ollie必赢,可手工验证。)
接着验证若Stan在ceil(N/18)时必输,则Stan在N时亦必输。只要Ollie出2,Stan即使出9也不能赢,Ollie接着出9,即赢。
# include <iostream>
# include <cmath>
using namespace std;
typedef unsigned long int ULI;
bool stanWin(ULI n)
{
if (2 <= n && n <= 9) {
return true;
} else if (n < 2) {
return false;
} else {
return stanWin(ceil(n / 18.0));
}
}
int main()
{
ULI n;
while (cin >> n) {
if (stanWin(n)) {
cout << "Stan wins." << endl;
} else {
cout << "Ollie wins." << endl;
}
}
return 0;
}
[url=http://blog.csdn.net/Sedgewick]感兴趣的来我的窝看看。[/url]
Stan and Ollie play the game of multiplication by multiplying an integer p by one of the numbers 2 to 9. Stan always starts with p = 1, does his multiplication, then Ollie multiplies the number, then Stan and so on. Before a game starts, they draw an integer 1 < n < 4294967295 and the winner is who first reaches pn.
当输入为N时,如果Stan在能赢,则说明之前的一轮Ollie无论出多少都不能赢。设当乘积为M且该Ollie发难(设Ollie出p)时,Stan有必赢的策略(不管Ollie出什么,Stan都出9),即
9×M<N,9×p×M≥N (p≥2)
等价于M≥ceil(N / (2×8)) (ceil为向上取整)
下面证明如果Stan在ceil(N/18)时有必赢的策略,则
9×ceil(N/18)<N且18×ceil(N/18)≥N.
设N = 18×k + r (k≥1,0≤r<18)代人上式即得。
(在10到18之间,Ollie必赢,可手工验证。)
接着验证若Stan在ceil(N/18)时必输,则Stan在N时亦必输。只要Ollie出2,Stan即使出9也不能赢,Ollie接着出9,即赢。
# include <iostream>
# include <cmath>
using namespace std;
typedef unsigned long int ULI;
bool stanWin(ULI n)
{
if (2 <= n && n <= 9) {
return true;
} else if (n < 2) {
return false;
} else {
return stanWin(ceil(n / 18.0));
}
}
int main()
{
ULI n;
while (cin >> n) {
if (stanWin(n)) {
cout << "Stan wins." << endl;
} else {
cout << "Ollie wins." << endl;
}
}
return 0;
}
[url=http://blog.csdn.net/Sedgewick]感兴趣的来我的窝看看。[/url]