CF 317D Game with Powers

典型的博弈题目

题意:

  两个人从1~n中轮流取数,每次取到x时,则x的任意整数幂均不能再被取,最后谁取不了就输。

题解:

  可以发现,对于该博弈游戏的子游戏是x的1~k次幂,进行上述规则下的博弈。

  而子游戏的SG值只与个数有关,与x的值无关。而k最大只有30,故可以打表。

  而游戏最终结果即所有子游戏异或值。

代码:(附打表程序)

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <utility>
#include <vector>
#include <queue>
#include <map>
#include <set>
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)>(y)?(y):(x))

using namespace std;

bool pd[100005];
int n;
/*打表
char SG[1100000000];
int getsg(int S)
{
    if(SG[S]!=-1) return SG[S];
    bool hash[32]={0};
    for(int i=1; i<=30; i++)
    if(S&(1<<(i-1)))
    {
        int tmS=S;
        for(int j=i; j<=30; j+=i)
            if(tmS&(1<<(j-1))) tmS-=1<<(j-1);
        hash[getsg(tmS)]=1;
    }
    for(int i=0; i<=30; i++)
    if(!hash[i])
        return SG[S]=i;
}
void init()
{
    memset(SG,-1,sizeof(SG));
    SG[0]=0;
    getsg((1<<30)-1);
    for(int i=1; i<=30; i++)
        printf("%d,",SG[(1<<i)-1]);
}
*/

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};

int main()
{
    scanf("%d",&n);
    long long ans=1;
    memset(pd,0,sizeof(pd));
    long long i,cut=0;
    for(i=2; i<=floor(sqrt(n)); i++)
    if(!pd[i])
    {
        int num=0;
        for(long long j=i; j<=n; j*=i)
        {
            if(j<=floor(sqrt(n))) pd[j]=1;
            else cut++;
            ++num;
        }
        ans^=SG[num];
    }
    ans^=(n-i+1-cut)&1;
    if(ans==0)
        printf("Petya\n");
    else
        printf("Vasya\n");
    return 0;
}

时间: 2024-10-25 20:25:46

CF 317D Game with Powers的相关文章

博弈论题目总结

博弈论相关题目很多,以下进行总结,并将在今后不定时更新. 基础题: POJ 2234 裸Nim游戏 POJ 2425 有向无环图+多个棋子,直接套用上面方法 POJ 2960 Nim游戏变形 POJ 2348 直接按照博弈递推一下即可 POJ 2975 求Nim游戏第一步的方法数 POJ 1704 Nim游戏变形,思考较难,实现简单. 题解:直接SG显然会超时,如何分解成一个个小游戏呢?可以发现,若最后只有两个棋子连在一起,那么后手必胜.因此从这里下手的话,容易找到如果每两个都是连在一起的话,依

微信 {&quot;errcode&quot;:40029,&quot;errmsg&quot;:&quot;invalid code, hints: [ req_id: Cf.y.a0389s108 ]&quot;}

{"errcode":40029,"errmsg":"invalid code, hints: [ req_id: Cf.y.a0389s108 ]"} 问题:微信网页授权后,获取到 openid 了,一刷新又没了 微信网页授权获取到的 code 只能使用一次(5分钟内有效),使用一次后,马上失效. 页面授权跳转成功,根据 code 也换取到 openid 了. 此时刷新页面,并不会再次进行授权,而是直接刷新了一下上一次授权跳转后的链接,带的还是

CF with friends and user&#39;s influence considered on NYC data(updated Aug,11st)

Here is the code link: https://github.com/FassyGit/LightFM_liu/blob/master/U_F1.py I use NYC data as other experimens. The split of the training data was seperated by the timeline, and I have normalised the interaction matrix by replacing the checkin

CF 750

今天CF打的块残废了     就是一废物 A 在24点之前到 直接模拟即可 #include<stdio.h> #include<algorithm> #include<cstring> #include<string> #include<cmath> using namespace std; #define LL long long #define MAXN 1010 #define inf 1000000000.0 int main() {

CF #394 (2) 5/6

Codeforces Round #394 (Div. 2) 总结:有毒的一场比赛.做了三题,结果A被叉,B.C挂综测,还hack失败一发,第一次在CF体会到了-50分的感觉..不知道是不是人品好,比赛时room炸了,然后,unrated.. A  水题,判一下0 0,然后abs(a-b)<=1 B  水题,组个间距比较一下,但一个数的时候要判一下 C  直接暴力上的题 D  也是xjb暴力 题意:给出n,l,r, a[], p[],另有两个数组b[], c[],ci=bi-ai.l<=ai,

一场CF的台前幕后(上)——转

前奏 大约4月份的时候,业界毒瘤pyx噔噔噔跑过来说:“酷爱!我YY了一道题!准备当CF的C” 我当时就被吓傻了."Yet another Chinese round?" “区间取模,区间求和” 感觉这题还不错?不过pyx嫌水了…… 好办!当时我刚刚出完动态仙人掌不久,于是一拍脑袋说:把这个问题出到仙人掌上去! 当然被pyx鄙视了…… 后来一直就没啥动静,直到5月底的CTSC. 试机的时候pyx给我看了套他出的神题……里面有一道题……我不小心读成了下面这个样子: “给定n个m维的模2意

[2016-03-22][CF][69A][Young Physicist]

时间:2016-03-22 19:41:34 星期二 题目编号:[2016-03-22][CF][69A][Young Physicist] 题目大意:判断向量和是否为0 分析:对应坐标相加 遇到的问题:不能用x+y+z来判断是否都为0,除非输入都是正数 #include <cstdio> using namespace std; int main(){ int a,b,c,x,y,z,n; x = y = z = 0; scanf("%d",&n); for(in

ARC下OC对象和CF对象之间的桥接(bridge)

在开发iOS应用程序时我们有时会用到Core Foundation对象简称CF,例如Core Graphics.Core Text,并且我们可能需要将CF对象和OC对象进行互相转化,我们知道,ARC环境下编译器不会自动管理CF对象的内存,所以当我们创建了一个CF对象以后就需要我们使用CFRelease将其手动释放,那么CF和OC相互转化的时候该如何管理内存呢?答案就是我们在需要时可以使用__bridge,__bridge_transfer,__bridge_retained,具体介绍和用法如下

【CF 520D】Cubes

[CF 520D]Cubes 怎么说呢--英语阅读题+超级大模拟-- 最重要的是知道怎么出来的数据...题意好懂 xy坐标内给出几个单位正方形 以正方形左下点坐标给出 y=0为地面 正方形下面或者左右下方至少存在一个正方形他才能稳定.. 正方形按0~m-1标号 每次只能取出不影响整体结构的正方形 甲乙玩一个游戏 交替取正方形 每取下一个按从左到右的顺序排好 得到一个大数 重点来了! 取出的数是m进制 转换为十进制是最终结果 甲希望结果最大 乙希望结果最小 问结果为多少 甲先取 题意明白了模拟就行