码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #651 (Div. 2) C. Number Game (博弈,数学)

时间:2020-06-21 15:56:29      阅读:60      评论:0      收藏:0      [点我收藏+]

标签: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!