C. Number Game
time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
Ashishgup and FastestFinger play a game.
They start with a number n and play in turns. In each turn, a player can make any one of the following moves:
Divide n by any of its odd divisors greater than 1.
Subtract 1 from n if n is greater than 1.
Divisors of a number include the number itself.
The player who is unable to make a move loses the game.
Ashishgup moves first. Determine the winner of the game if both of them play optimally.
Input
The first line contains a single integer t (1≤t≤100) — the number of test cases. The description of the test cases follows.
The only line of each test case contains a single integer — n (1≤n≤109).
Output
For each test case, print “Ashishgup” if he wins, and “FastestFinger” otherwise (without quotes).
Example
inputCopy
7
1
2
3
4
5
6
12
outputCopy
FastestFinger
Ashishgup
Ashishgup
FastestFinger
Ashishgup
FastestFinger
Ashishgup
Note
In the first test case, n=1, Ashishgup cannot make a move. He loses.
In the second test case, n=2, Ashishgup subtracts 1 on the first move. Now n=1, FastestFinger cannot make a move, so he loses.
In the third test case, n=3, Ashishgup divides by 3 on the first move. Now n=1, FastestFinger cannot make a move, so he loses.
In the last test case, n=12, Ashishgup divides it by 3. Now n=4, FastestFinger is forced to subtract 1, and Ashishgup gets 3, so he wins by dividing it by 3.
思路
如果是大于二的偶数,那么让他一直除以2,直到无法整除2为止,那么所剩下的数一定是奇数,然后判断这个数是否是素数。
#include <iostream>
#include<algorithm>
#include<cstdio>
#include<string>
#include<cstring>
#include<map>
using namespace std;
map<int,int>mp;
bool isprime(int n)
{
if(n==1) return false;
else
{
for(int i=2;i*i<=n;i++)
{
if(n%i==0)
return false;
}
return true;
}
}
int main()
{
mp[4]=1;
int tt=4;
while(1)
{
tt=tt*2;
mp[tt]=1;
if(tt>1e9)
break;
}
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
if(n==1)
{
printf("FastestFinger\n");
}
else if(n==2)
{
printf("Ashishgup\n");
}
else if(n%2==1)
{
printf("Ashishgup\n");
}
else
{
if(mp[n]) printf("FastestFinger\n");
else
{
int cnt=0;
while(1)
{
if(n%2==0)
{
n=n/2;
cnt++;
}
else break;
}
if(cnt==1)
{
if(isprime(n))
{
printf("FastestFinger\n");
}
else printf("Ashishgup\n");
}
else
{
printf("Ashishgup\n");
}
}
}
}
return 0;
}