游 戏 游戏 游戏
题目链接:jzoj 1984
题目大意
有很多个东西,每个人轮流去
2
x
2^x
2x个(
x
x
x为正整数),谁最后取完,谁就赢。
一共玩三局,给出东西的数量,说出谁赢。如果是先出的赢,说出他第一次拿的最小数量。
(先出赢为
“
M
a
o
L
a
o
D
a
w
i
l
l
w
i
n
.
”
“MaoLaoDa willwin.”
“MaoLaoDawillwin.”,后出赢为
“
K
i
n
g
w
i
l
l
w
i
n
.
”
“King will win.”
“Kingwillwin.”)
样例输入1
8
4
2
样例输出1
MaoLaoDa will win.
2
MaoLaoDa will win.
1
MaoLaoDa will win.
2
样例输入2
3
8
2
样例输出2
King will win.
MaoLaoDa will win.
2
MaoLaoDa will win.
2
数据范围
0<n<10^1000002
思路
这道题是一道规律题。
我们推一下就可以发现,当东西的数量能被三整除时,后出的会赢。但不能被三整除时,先出的会赢,而且他第一次拿的最小数量为数量对三取模的值。
不过,这道题东西的数量值很大很大。
我们可以知道,当一个数的每一位的和能被三整除时,这个数也能被三整除。
我们用这个方法,就可以解决那些很大的数了。
那么这样子,我们就可以解决这道题了。
代码
#include<cstdio>
#include<iostream>
using namespace std;
string n;
int nn;
int main()
{
//freopen("atlantis.in","r",stdin);
//freopen("atlantis.out","w",stdout);
for (int i=1;i<=3;i++)
{
cin>>n;//读入
nn=0;//初始化
for (int j=0;j<n.size();j++)
nn+=n[j]-48;//求出每一位的和
if (nn%3==0) printf("King will win.\n");//能被3整除,则后出的赢
else printf("MaoLaoDa will win.\n%d\n",nn%3);//不能,则先出的赢
}
//fclose(stdin);
//fclose(stdout);
return 0;
}