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

洛谷 P4018 Roy&October之取石子

ace 否則 mes AS 一行 ide 個人 img 一次

                洛谷 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>
 2
#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 }
AC

      一世安寧

洛谷 P4018 Roy&October之取石子