CF1370C题解
本蒟蒻的第二篇题解,找题归功于教练
这道题目找好了规律很简单:
具体思路:
题目大意:
有一个正整数 。两名玩家轮流操作。每次操作可以执行以下一种:
- 将 除以一个 的奇数因子。
- 将 减去 。
问先手是否有必胜策略。如果先手有必胜策略,输出 Ashishgup,否则输出 FastestFinger。
题目分析:
首先,拿到 的会输掉。
直观分析可以得到:
- 当 拿到 或奇数的时候必赢,因为 或奇数 奇数都使得对方得到 。
在此基础上继续分析其他数值:设 为奇质数:
-
如果一个数是 ,那么 只能执行 奇数操作,对方拿到 ,对方必赢,因此 必输。
-
如果一个数是 那么 可以执行 奇数操作,是的对方拿到 ,因此 必赢。
-
当 为 时候, 只能执行 操作,因此 必输。
-
如果一个数是是 , 执行 奇数操作,对方得到 ,对方必输,因此 必赢。

知道以上信息代码就很简单了。
源码:
//A 必胜态 2,3,奇数... 2*ji^2,2^k*ji
//A 必输 1,4,8...2^k(k>1);2*ji
#include <bits/stdc++.h>
using namespace std;
bool prime(int x) {
for(int i=2;i*i<=x;i++) {
if(x%i==0){
return false;
}
}
return true;
}
bool work() {
int x;
cin>>x;
if(x==1)return 0;//0必输态
else if(x==2||x&1) return 1;//2和奇数必赢态
else if(x&2) {//2*奇数
x>>=1;
if(prime(x))return 0;//2*奇质数:必输态
else return 1;//2*奇数*奇数 必赢态
}
else {
while(!(x&1))x>>=1;
if(x==1) return 0;//2^k,必输态
else return 1;//2^k*ji必赢态。
}
}
int main() {
int t;
cin>>t;
while(t--){
if(work())cout<<"Ashishgup\n";
else cout<<"FastestFinger\n";
}
return 0;
}
本人(KK_SpongeBob)蒟蒻,写不出好文章,但转载请注明原文链接:https://www.cnblogs.com/OIer-QAQ/p/18575293

浙公网安备 33010602011771号