爱丽丝和鲍勃在玩游戏。它们从一个正整数n开始,轮流对其进行操作。玩家每回合可以从n中减去一个不是1或n的除数。在他/她的回合中不能移动的玩家失败。爱丽丝总是先动。注意,他们在每个回合中减去当前数字的除数。你被要求找出如果两个玩家都发挥最佳,谁将赢得游戏。输入第一行包含一个整数t (1 < t < 104)——测试用例的数量。然后是测试用例。每个测试用例都包含一个整数n (1 <n < 109)——初始值。输出对于每个测试用例,如果Alice将赢得游戏,则输出“Alice”,如果Bob将赢得游戏,则输出“Bob”,如果双方都采用最佳玩法。
Example
input
Copy
4 1 4 12 69
output
Copy
Bob Alice Alice Bob
请注意在第一个测试案例中,游戏立即结束,因为Alice无法移动。在第二个测试案例中,Alice可以减去2,使n= 2,那么Bob不能移动,所以Alice赢了。在第三个测试案例中,Alice可以减去3,使n =9。Bob唯一的动作是减去3,使n = 6。爱丽丝可以再减去3和n3。然后鲍勃不能动,所以爱丽丝赢了。
题解:
假如n为奇数
1.如果n为质数,那么A直接输
2.如果n不是质数,那么n可以分为两个奇数的乘积,a操作后,n一定是个偶数(并且奇数因子,一定不是2),b操作后,再减去一个奇数,n又变成奇数,所以b必不可能输
假如n为偶数
1.如果n有不为1的奇数因子,可以减去一个奇数因子,变成上述情况,A必赢
2.n无不为1的奇数因子,n的形式为2^k
为了不变成奇数情况每个人会减2 ^(k-1),所以看谁先变成2
k%2 B赢
k%2 == 0 A输
#include<iostream>
#include<string>
#include<vector>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
#include<map>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
int pri[200050];
int vis[200050];
int cnt = 0;
void solve()
{
int n;
scanf("%d",&n);
if(n % 2)
{
printf("Bob\n");
return ;
}
int k = 0;
while(n%2 == 0)
{
n /= 2;
k++;
}
if(n!=1)
{
cout <<"Alice\n";
}
else
{
if(k%2)
{
cout <<"Bob\n";
}
else
{
printf("Alice\n");
}
}
}
signed main()
{
// ios::sync_with_stdio(0);
// cin.tie(0);cout.tie(0);
int t = 1;
scanf("%d",&t);
while (t--)
{
solve();
}
return 0;
}