题目地址:
https://www.luogu.com.cn/problem/P4018
题目背景:
Roy 和 October 两人在玩一个取石子的游戏。
题目描述:
游戏规则是这样的:共有
n
n
n个石子,两人每次都只能取
p
k
p^k
pk个(
p
p
p为质数,
k
k
k为自然数,且
p
k
p^k
pk小于等于当前剩余石子数),谁取走最后一个石子,谁就赢了。现在October先取,问她有没有必胜策略。若她有必胜策略,输出一行October wins!
;否则输出一行Roy wins!
。
输入格式:
第
1
1
1行一个正整数
T
T
T,表示测试点组数。
第
2
2
2行
∼
\sim
∼第
T
+
1
T+1
T+1 行,一行一个正整数
n
n
n,表示石子个数。
输出格式:
T
T
T行,每行分别为October wins!
或Roy wins!
。
数据范围:
对于
30
%
30\%
30%的数据,
1
≤
n
≤
30
1\leq n\leq 30
1≤n≤30;
对于
60
%
60\%
60%的数据,
1
≤
n
≤
1
0
6
1\leq n\leq 10^6
1≤n≤106;
对于
100
%
100\%
100%的数据,
1
≤
n
≤
5
×
1
0
7
1\leq n\leq 5\times 10^7
1≤n≤5×107,
1
≤
T
≤
1
0
5
1\leq T\leq 10^5
1≤T≤105。
可以证明 6 k , k = 0 , 1 , 2 , . . . 6k, k=0,1,2,... 6k,k=0,1,2,...是必败态。 0 0 0显然是必败态。由于 ∄ p , 6 = p m \nexists p, 6=p^m ∄p,6=pm,所以这些态互相不可达;而由于 1 = p 0 , 4 = 2 2 1=p^0,4=2^2 1=p0,4=22,而 2 , 3 , 5 2,3,5 2,3,5都是素数,所以别的状态都能到 6 k 6k 6k的状态。所以 6 k 6k 6k是必败态。代码如下:
#include <iostream>
using namespace std;
int main() {
int T;
scanf("%d", &T);
while (T--) {
int x;
scanf("%d", &x);
x % 6 ? puts("October wins!") : puts("Roy wins!");
}
}
每组数据时空复杂度 O ( 1 ) O(1) O(1)。