Codeforces Round #651 (Div. 2) C. Number Game (博弈,数学)
Posted lr599909928
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #651 (Div. 2) C. Number Game (博弈,数学)相关的知识,希望对你有一定的参考价值。
-
题意:对于正整数(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 (博弈,数学)的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #651 (Div. 2) E - Binary Subsequence Rotation 思维
Codeforces Round #651 (Div. 2) C. Number Game (博弈,数学)
Codeforces Round #651 (Div. 2) D. Odd-Even Subsequence(二分)
Codeforces Round #651 (Div. 2) D - Odd-Even Subsequence 二分