洛谷——P4018 Roy&October之取石子
阿新 • • 發佈:2017-12-31
我們 題目 她有 第一個 char ber borde spa range
P4018 Roy&October之取石子
題目背景
Roy和October兩人在玩一個取石子的遊戲。
題目描述
遊戲規則是這樣的:共有n個石子,兩人每次都只能取p^kpk個(p為質數,k為自然數,且p^kpk小於等於當前剩余石子數),誰取走最後一個石子,誰就贏了。
現在October先取,問她有沒有必勝策略。
若她有必勝策略,輸出一行"October wins!";否則輸出一行"Roy wins!"。
輸入輸出格式
輸入格式:
第一行一個正整數T,表示測試點組數。
第2行~第(T+1)行,一行一個正整數n,表示石子個數。
輸出格式:
T行,每行分別為"October wins!"或"Roy wins!"。
輸入輸出樣例
輸入樣例#1: 復制3 4 9 14輸出樣例#1: 復制
October wins! October wins! October wins!
說明
對於30%的數據,1<=n<=30;
對於60%的數據,1<=n<=1,000,000;
對於100%的數據,1<=n<=50,000,000,1<=T<=100,000。
(改編題)
乍一看像是博弈
其實數學歸納法也可以完成這個題目
我們來看下面的表格
棋子的個數 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
第一個人取得個數 | 1^1 |
2^1 | 3^1 | 2^2 | 5^1 | 2^2 | 1^1+2^1 | 2^1+2^1 | 3^1+2^1 |
第二個人取得個數 | 0 | 0 | 0 | 0 | 0 | 2^1 | 2^2 | 2^2 | 2^2 |
當棋子的個數小於等於6的時候,我們可以看到在1~5的時候全是第一個人贏,當n=6是第二個人贏,當7~11內我們可以將數拆成1~5內的一個數想讓第一個人拿,然後余出個6,這樣第二個人就不可能一次拿完,只能再讓第一個人拿一次,這樣第一個人必勝,當12時,第二個人贏、、、以此類推,我們可以發現,當n為6的倍數的時候,第二個人贏,其余情況均為第一個人贏
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int T,n; int read() { int x=0,f=1; char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘) x=x*10+ch-‘0‘,ch=getchar(); return x*f; } int main() { T=read(); while(T--) { n=read(); if(n%6==0) printf("Roy wins!\n"); else printf("October wins!\n"); } return 0; }
洛谷——P4018 Roy&October之取石子