1. 程式人生 > >洛谷——P4018 Roy&October之取石子

洛谷——P4018 Roy&October之取石子

我們 題目 她有 第一個 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之取石子