【洛谷】P4018 Roy&October之取石子(配数学证明)

文章描述了一个关于石子游戏的编程问题,其中两个人按照特定规则(基于质数幂次取石子)进行游戏。October先手,需要判断是否有必胜策略。关键在于分析6k(k从0到无穷)的状态是必败态。给定输入后,代码通过判断剩余石子数对6取模的结果来决定胜负。
摘要由CSDN通过智能技术生成

题目地址:

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 1n30
对于 60 % 60\% 60%的数据, 1 ≤ n ≤ 1 0 6 1\leq n\leq 10^6 1n106
对于 100 % 100\% 100%的数据, 1 ≤ n ≤ 5 × 1 0 7 1\leq n\leq 5\times 10^7 1n5×107, 1 ≤ T ≤ 1 0 5 1\leq T\leq 10^5 1T105

可以证明 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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值