【ybt高效进阶6-5-2】数字游戏(博弈论)
数字游戏
题目链接:ybt高效进阶6-5-2
题目大意
给你一个数,两个人轮流对数进行操作,谁先不能操作,谁就输了。
操作是将它除以一个大于 1 的任意一个奇数因子,或者在它 >1 的时候,也可以选择把它减一。
问你是先手必胜还是先手必败。
思路
首先发现 1 1 1 的话就是先手必败, 2 2 2 就是先手必胜。
接着发现如果是非
1
1
1 奇数就直接先手必胜。(直接除这个数变成
1
1
1)
然后接着讨论偶数,发现是不能
−
1
-1
−1 的,因为减了就变成奇数,就败了。(
2
2
2 已经讨论过,所以不算在内)
那就只能除奇数因子,那就有如果是 n = 2 x n=2^x n=2x 且 x > 1 x>1 x>1 的数,那就没得除,就先手必败。
那我们继续分析,由于
2
1
2^1
21 是必胜而
2
x
(
x
>
1
)
2^x(x>1)
2x(x>1) 必败,我们考虑分开来讨论。
如果只有一个
2
2
2,那就看奇数,如果奇数可以通过除一次让它变成质因子,那就是必胜,否则就是必败。(要满足这个其实就是让它原本不是质因子就可以了)
那如果有多个
2
2
2,那你只要把奇数因子全部除掉,那给对面的就是
2
x
(
x
>
1
)
2^x(x>1)
2x(x>1),那就是后手必败,也就是先手必胜了。
那这里其实可以总结一下,其实就是当
n
=
2
∗
W
n=2*W
n=2∗W,如果
W
W
W 是质因子就是先手必败,否则就是先手必胜。
然后就可以了。
代码
#include<cstdio>
using namespace std;
int T, n;
bool is_prime(int n) {
for (int i = 2; 1ll * i * i <= n; i++)
if (n % i == 0) return 0;
return 1;
}
bool fang2(int n) {
if ((n & (-n)) == n) return 1;
return 0;
}
bool ck(int n) {
if (n == 1) return 0;
if (n == 2) return 1;
if (n & 1) return 1;
else n >>= 1;
if (fang2(n)) return 0;//2^n 的情况
if (is_prime(n)) return 0;
else return 1;
}
int main() {
scanf("%d", &T);
while (T--) {
scanf("%d", &n);
if (ck(n)) printf("Ashishgup\n");
else printf("FastestFinger\n");
}
return 0;
}
相关文章
- 【C++游戏引擎Easy2D】想做游戏,这三个功能少不了(time+renderer+logger)
- HTML5游戏开发5条建议及开发工具分享
- 《MFC游戏开发》笔记八 游戏特效的实现(二):粒子系统
- html5游戏开发--"动静"结合用地图块拼成大地图 & 初探lufyl
- 大数据能否破解模拟体育竞技类游戏性质之谜?
- Unity 5.X 3D游戏开发技术详解与典型案例
- 从搬运工做起 动视云让游戏不再受终端束缚
- 棋牌游戏服务器架构设计
- 外媒:中国游戏服务公司iGSKY入侵Xbox账户,并涉嫌洗钱
- 数字游戏。
- Cocos2d-x游戏开发实例详解6:自动释放池
- Docker在英雄联盟游戏中的实践探索(一)
- Docker在英雄联盟游戏中的实践探索(三)
- 【ybt高效进阶4-1-3】【luogu P5462】龙珠游戏 / X龙珠
- 【ybtoj高效进阶 21284】快乐游戏(DP)(树状数组)
- 我的Android进阶之旅------>Android疯狂连连看游戏的实现之状态数据模型(三)