CodeForces 317D Game with Powers

本文解析了CodeForces317D题目,通过将游戏划分为多个子游戏并利用SG函数求解,实现了O(√N)的时间复杂度。介绍了如何通过统计不超过√N的数来简化问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CodeForces 317D Game with Powers

题目描述:

1 N N 个数,两个人轮流操作,每次取一个数,并且不能取以前取过的数的任意正整数次幂,第一个无法操作的人输,问谁能赢。

题解:

假设 x 不是任何其它数的正整数次幂,把 x 和它的正整数次幂分成一类,显然一个数不可能同时属于两类,于是整个游戏就被分成了若干个互不干扰的子游戏,且每个子游戏的规模不超过 log2N ,打表求出 SG 函数异或起来即可,但这样时间复杂度为 O(N)

然而实际上,对于超过 N x ,子游戏的规模一定为 1 ,所以我们只需要统计小于等于 N x 即可,时间复杂度 O(N)

题目链接: vjudge 原网站

代码:

#include <set>
#include <cstdio>
#include <bitset>
#include <cstdlib>
#include <algorithm>
using namespace std;

#define MAXN 1000000007
#define MAXM 43

const int SG[] = {0, 1, 2, 1, 4, 3, 2, 1, 5, 6, 2, 1, 8, 7, 5, 9, 8, 7, 3, 4, 7, 4, 2, 1, 10, 9, 3, 6, 11, 12, 14};

static set<int> st;
static int N, K = 0;
static bitset<MAXN> vis;

int main()
{
    scanf("%d", &N);
    for (int i = 2; i * i <= N; i++)
        if (!vis[i])
        {
            int num = 0;
            for (long long j = i; j <= N; j *= i, num++) st.insert(j), vis[j] = 1;
            K ^= SG[num];
        }
    printf("%s\n", (K ^ ((N - st.size()) & 1)) ? "Vasya" : "Petya");
    return 0;
}

提交记录(AC / Total = 1 / 5):

Run IDRemote Run IDTime(ms)Memory(kb)ResultSubmit Time
87629332633221360124156WA2017-04-13 14:55:26
87631032633234392124152WA2017-04-13 15:06:24
87632452633243792124168WA2017-04-13 15:16:04
876335526332524124124352RE2017-04-13 15:24:27
876340026332547124126344AC2017-04-13 15:27:14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值