博弈论 sg 加训

cf1370C


#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
#define debug cout << "debug" << ' '

void fileio()
{
  //#ifdef LGS
  freopen("in.txt","r",stdin);
  freopen("out.txt","w",stdout);
  //#endif
}

void fileclose()
{
    fclose(stdin);//关闭文件
    fclose(stdout);//关闭文件
}

int n;
string res[5];



bool is_prime(int n)
{
  if(n < 2) return false;
  for(int i = 2;i <= n/i;i ++)
  if(n % i == 0 ) return false;
  return true;
}

void solve()
{
  res[0] = "Ashishgup";     // win first
  res[1] = "FastestFinger";

  cin >> n;
  //cout << n << '*' << endl;

  if(n == 1){ cout << res[1] << endl; return; }
  if(n == 2){ cout << res[0] << endl; return; }
  if(n % 2 == 1){ cout << res[0] << endl; return; }

  int cnt_two = 0;
  while(n % 2 == 0){ cnt_two ++; n/= 2;}
 
 if(n == 1) { cout << res[1] << endl; return;}
  //debug; cout << cnt_two << endl;
  //debug; cout << n << endl;
  
  if(is_prime(n)) { 
    //if(cnt_two > 1) {cout << res[0] << endl; return;}
    if(cnt_two == 1) { cout << res[1] << endl;  return;}
    }
   
   
    cout << res[0] << endl; 



}

set<int> cacl(int n)
{
    set<int> s;
    for(int i = 2;i * i <= n;i ++)
    if(n/i == 0)
    {
       if(i % 2 == 1) s.insert(i);
       if((n/i) % 2 == 1) s.insert(i);
    }
    if(n % 2 == 1) s.insert(n);
    return s;
}

signed main()
{
  // fileio();  
  
   int tc = 1;
  cin >> tc;
   for(int T = 0; T < tc;T ++) solve();
}

cf317D

// http://172.16.44.165/problem/P/1880
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define fi first
#define se second
using namespace std;

void fileio()
{
  //#ifdef LGS
  freopen("in.txt","r",stdin);
  freopen("out.txt","w",stdout);
  //#endif
}

void fileclose()
{
    fclose(stdin);//关闭文件
    fclose(stdout);//关闭文件
}

const int N = 1e7 + 10;
const int MAC = 1e5 + 10;
const int all = 30;

int sg[50]={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};


bool is_used[N];
map<int,int> mp;

bool vis[MAC];

map<int ,int>M;

int cacl(int x)
{
    if(x == 0) return 0;
    if(M[x]) return M[x];
    
    int ed = (1LL << x) - 1;
    map<int,int>mex;
    
    for(int i = 0;i < all;i ++)
    {
        if((x & (1LL << i)))
        {
            int tmp = x;
            for(int j = 1; j*(i + 1) <= all;j ++)
            {
                int duo = (1LL << (((i + 1) * j) - 1));
                tmp -= duo;
            }
            mex[cacl(tmp)] = 1;
        }
    }

    for(int i = 0; ;i ++) if(!mex[i]) return M[x] = i;
    
}

void solve()
{
   // map<int,int>mmp;
    // cout << "%%% " <<mmp[100] << endl;
    int sum = 0;
    memset(is_used,false,sizeof is_used);
    
    int n;
    cin >> n;
    for(int i = 2;i * i<= n;i ++)
    {
        if(!is_used[i])
        {
            int j = i;
            while(j <= n)
            {   
                if(j <= 1e7){ if(!is_used[j])
                {
                   mp[i] ++; is_used[j] = true;   
                }}
                else mp[i] ++;
                j *= i;
            }
        }
    }

   // for(auto x : mp)
   // cout << x.fi << ' ' << x.se << endl;

    for(auto x : mp) if(x.se > 1) sum += x.se;

    sum = n - sum;
    //cout << sum << endl;
   // if(n >= 2) sum ++;
    sum = (sum % 2) ? 1 : 0;

    
    
    int res = sum;
    for(auto x : mp) if(x.se > 1) res ^= sg[x.se];

 //   for(int i = 0;i <= 10;i ++ )cout << cacl(i) << ' ';
  //  cout << endl;


   // cout << res << endl;
   
    cout << (res ? "Vasya" : "Petya") << endl;
    return;

}

signed main()
{
   //fileio();  
  
   int tc = 1;
  // cin >> tc;
   for(int T = 0; T < tc;T ++) solve();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值