Description
两个人
Vasya
和
Petya
玩游戏,从
1
~
Input
一个正整数
n
(
Output
输出胜者
Sample Input
1
Sample Output
Vasya
Solution
如果
x
不是任一
Code
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
#define maxn 33
int sg[maxn]={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};
map<int,int>m;
int solve(int n)
{
if(n==0)return 0;
if(m.find(n)!=m.end())return m[n];
int f[maxn];
memset(f,0,sizeof(f));
for(int i=1;i<=30;i++)
if(n&(1<<i))
{
int tn=n;
for(int j=i;j<=30;j+=i)
if(n&(1<<j))
tn^=(1<<j);
f[solve(tn)]=1;
}
for(int i=0;;i++)
if(!f[i])return m[n]=i;
}
void init()
{
m.clear();
sg[0]=0;
for(int i=1;i<=30;i++)sg[i]=solve((1<<(i+1))-2);
}
set<int>s;
int vis[55555];
int main()
{
//init();
//for(int i=0;i<=30;i++)printf("%d ",sg[i]);
int n;
while(~scanf("%d",&n))
{
s.clear();
memset(vis,0,sizeof(vis));
int ans=0;
for(ll i=2;i*i<=n;i++)
if(!vis[i])
{
int num=0;
for(ll j=i;j<=n;j*=i)
{
num++,s.insert(j);
if(j*j<=n)vis[j]=1;
}
//printf("num=%d\n",num);
ans^=sg[num];
}
if((n-s.size())&1)ans^=1;
printf("%s\n",ans?"Vasya":"Petya");
}
return 0;
}