标签:mes iostream str pre names 题意 cto img 情况
题意:对于正整数\(n\),每次可以选择使它变为\(n-1\)或者\(n/t\) (\(n\ mod\ t=0\)且\(t\)为奇数),当\(n=1\)时便不可以再取,问先手赢还是后手赢.
题解:首先特判\(1\)和\(2\)的情况,然后显然如果\(n\)是奇数,一定是先手赢.
? 如果\(n\)是偶数,那么我们去找它的奇数因子.
? 如果没有,那么先手只能减一,后手直接赢.
? 如果有,那么我们直接将它的所有奇数因子拿走,剩下一个孤零零的偶数给后手,如果这个偶数不是\(2\)的话,先手赢,否则后手赢.
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <set>
#include <unordered_set>
#include <unordered_map>
#define ll long long
#define fi first
#define se second
#define pb push_back
#define me memset
const int N = 1e6 + 10;
const int mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;
using namespace std;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
int t;
int n;
bool check(int x){
for(int i=2;i<=x/i;++i){
if(x%i==0){
if(i!=2 && x/i!=2){
if(i%2==1 || (x/i)%2==1){
return true;
}
}
}
}
return false;
}
int main() {
ios::sync_with_stdio(false);cin.tie(0);
cin>>t;
while(t--){
cin>>n;
if(n==1){
cout<<"FastestFinger"<<endl;
}
else if((n%2==1&&n>1)||n==2){
cout<<"Ashishgup"<<endl;
}
else{
if(check(n)){
cout<<"Ashishgup"<<endl;
}
else{
cout<<"FastestFinger"<<endl;
}
}
}
return 0;
}
Codeforces Round #651 (Div. 2) C. Number Game (博弈,数学)
标签:mes iostream str pre names 题意 cto img 情况
原文地址:https://www.cnblogs.com/lr599909928/p/13172551.html