• D. Game with Powers


    Vasya and Petya wrote down all integers from 1 to n to play the "powers" game (n can be quite large; however, Vasya and Petya are not confused by this fact).

    Players choose numbers in turn (Vasya chooses first). If some number x is chosen at the current turn, it is forbidden to choose x or all of its other positive integer powers (that is, x2, x3, ...) at the next turns. For instance, if the number 9 is chosen at the first turn, one cannot choose 9 or 81 later, while it is still allowed to choose 3 or 27. The one who cannot make a move loses.

    Who wins if both Vasya and Petya play optimally?

    Input

    Input contains single integer n (1 ≤ n ≤ 109).

    Output

    Print the name of the winner — "Vasya" or "Petya" (without quotes).

    Examples
    input
    1
    output
    Vasya
    input
    2
    output
    Petya
    input
    8
    output
    Petya
    Note

    In the first sample Vasya will choose 1 and win immediately.

    In the second sample no matter which number Vasya chooses during his first turn, Petya can choose the remaining number and win.

     我感觉这个问题,要是深入的了解了SG函数做这个题是很轻松的,但是我菜啊,so只能先把别人的代码看懂了,但是真的感觉这个问题是SG函数的经典的问题。因为要是把SG函数写在里面真的是时间爆炸啊,因为集合中最多才可能是29个,所以直接打表然后就OK了

    #include<bits/stdc++.h>
    using namespace std;
    long long cnt;
    int vis[200000];
    map<long long,long long>f;
    /*int SG(long long r)
    {
        int vis[40];
        memset(vis,0,sizeof(vis));
        if(f[r]) return f[r];
        if(r==0) return 0;
        for(int i=1;i<=30;i++)
        {
            if(r&(1<<(i-1)))
            {
                long long tem=r;
                for(int j=i;j<=30;j+=i)
                {
                    cnt++;
                    if(tem&(1<<(j-1)))
                    tem^=(1<<(j-1));
                }
                vis[SG(tem)]=1;
            }
        }
        for(int i=0;;i++)
        {
            if(vis[i]==0)
            {
                f[r]=i;
                return i;
            }
        }
    }*/
    int main()
    {
        int sg[30]={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};
        int n;
        scanf("%d",&n);
        int k;
        for(k=1;;k++)
        {
            if(k*k>=n) break;
        }
        f[1]=1;
        long long sum=0;
        long long ans=0;
        for(int i=2;i<=k;i++)
        {
            int cnt=0;
            long long temp=i;
            if(vis[temp]) continue;
            while(temp<=n)
            {
                cnt++;
                if(temp<=k) vis[temp]=1;
                if(temp>k) sum++;
                temp*=i;
            }
            f[cnt]++;
        }
        f[1]+=n-k-sum;
        for(int i=1;i<=30;i++)
        {
            if(f[i]&1) ans^=sg[i];
        }
        if(ans) printf("Vasya");
        else printf("Petya");
    }
    

      

  • 相关阅读:
    sql中的并、交、差
    白水的sql需求:每个病人的对应最小诊断类别|partition|
    |转|oracle行转列点评oracle11g sql新功能pivot/unpivot
    oracle wm_concat(column)函数的使用不同公司支付同一客商(行转列)|转|
    记录那些删除的伴我成长的触发器
    PL/SQL Developer使用技巧|F=Forwarding|
    手工创建数据库 ocp课程 wait for
    Oracle数据库监听配置|转|
    最新解决的sql:病人相邻两次看病小于3天
    tns的一些常见错误分析实例 |转|
  • 原文地址:https://www.cnblogs.com/Heilce/p/6582131.html
Copyright © 2020-2023  润新知