洛谷 P4018 Roy&October之取石子
洛谷 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都可以一次取到,當n=6時,第一個人先取1-5個,無論怎麽取,第二個人全去走就贏了。
二.對於6的倍數,一定不能是質數的K次方,證明:先是除2以外的質數都是奇數,而奇數乘奇數都是奇數,故6的倍數全不是n的K次方;對於2,由於6中存在因數3,故6*n也不是2的K次方。
三.對於12,第一個人取1-5個,第二個人直接取到剩下6個,就變成了情況一,第一個人取不到6個,若去6個以上,則直接敗;
四.歸納6*n。第一個人無法去6的倍數個,第二個人只要將數壓倒6*m(m<n)就會慢慢推到情況二,就又是第一個人輸。
五。對於非6的倍數,第一個人只要去1-5個,使之變成6的倍數,就變成情況四了。
所以,只有當a為六的倍數時,Roy才能贏。
1 #include<cstdio> 2AC#include<iostream> 3 using namespace std; 4 int main(){ 5 int t,a; 6 scanf("%d",&t); 7 for(int i=1;i<=t;i++){ 8 scanf("%d",&a); 9 if(a%6!=0) 10 printf("October wins!\n"); 11 else 12 printf("Roy wins!\n"); 13 } 14 return 0; 15 }
一世安寧
洛谷 P4018 Roy&October之取石子