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
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 百万级群聊的设计实践
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期