小明和小華利用積木玩了一場遊戲。
小明拿出了n塊積木(0<n<10(1000002次方)),現在他和小華輪流拿走一些積木,每人每次拿走的塊數是2的次方(例如1,2,4,8,16……)誰能拿走最後一個積木,誰就獲勝。
現在小華讓小明先拿。如果他們都足夠聰明,那麼誰能取得勝利呢?由於這個遊戲採用三局兩勝制度,小明想知道這三局每局他能否獲勝,如果必勝,第一步最少拿走的積木數量是多少?
輸入格式
三行每行一個數n。
輸出格式
對於每局,如果小華必勝則輸出一行“Hua will win.";否則第一行輸出”Ming will win.",第二行輸出他第一次拿的最小數量。
數據範圍
對於10%的數據n<=10
對於30%的數據n<=100000
對於100%的數據,0<n<10(1000002次方)
樣例輸入
8
4
2
樣例輸出
Ming will win.
2
Ming will win.
1
Ming will win.
2
這題就是找規律,如果n%3==0,那麼hua必勝,否則ming必勝
但是這裏的數據很大,所以用高精來求餘數。
#include<bits/stdc++.h>
using namespace std;
char a1[1000010];
int a[1000010], lena, i, res[1000010], s;//res[110]存儲每一位商 s表示餘數
int main(){
long long n;
for(int j=1; j<=3; j++){
gets(a1);
lena=strlen(a1);
//高精求餘數
for(i=0; i<lena; i++)//將a1字符串數組按照順序存儲在a[i]整形數組中
a[i]=a1[i]-'0';
s=a[0];//將餘數初始化
for(i=1; i<lena; i++)//for循環輸出找到每一位商,和最後的餘數
{
int aa=s*10+a[i];//aa表示除數
res[i]=aa/3;//取得商
s=aa%3;//取得餘數
}
s %= 3;
//判斷餘數
if(s == 0){
printf("Hua will win.\n");
}else if(s == 1 || s == 2){
printf("Ming will win.\n");
printf("%d\n",s);
}
}
return 0;
}