AT_agc010_d [AGC010D] Decrementing
有迹可循的思维题,切完之后感觉很爽!
考虑慢慢想一些性质:
- 可以注意到只会除以
次 。 - 只要存在了一个数字
,那么之后胜负只与奇偶性有关。对于一名玩家尽可能要在达到存在一个 之前调整好奇偶性。 - 发现大多数操作也改变不了奇偶性,只有所有数字都为偶数之后除一次才有奇偶性变化。
- 想除一次
是很困难的,而阻止对方除一次 是简单的。
那么现在如果当前玩家急需调整一次奇偶性,只有可能在最开始只存在一个奇数的时候做除法。因为对方肯定不希望你调整。不难发现如果先手处于奇偶性的优势则先手必胜,因为先手可以保证后手永远无法调整奇偶性。而先手如要调整则会不断调整,直到当前先手处于奇偶性优势或者存在不止两个奇数为止,而顶多只会进行
代码:
#include <bits/stdc++.h>
#define int long long
#define ls (p << 1)
#define rs (ls | 1)
#define rep(i, l, r) for (int i = l; i <= r; ++ i)
#define rrp(i, l, r) for (int i = r; i >= l; -- i)
#define pii pair <int, int>
#define eb emplace_back
#define x first
#define y second
#define inf 1000000000
#define linf 1000000000000000000
using namespace std;
typedef long long ll;
constexpr int N = 1e5 + 5, P = 998244353;
inline int rd () {
int x = 0, f = 1;
char ch = getchar ();
while (! isdigit (ch)) { if (ch == '-') f = -1; ch = getchar (); }
while (isdigit (ch)) { x = (x << 1) + (x << 3) + ch - 48; ch = getchar (); }
return x * f;
}
int n, a[N];
int32_t main () {
// freopen ("1.in", "r", stdin);
// freopen ("1.out", "w", stdout);
n = rd ();
int s = 0;
rep (i, 1, n) {
a[i] = rd ();
s ^= a[i] & 1;
}
if (s ^ (n & 1)) {
puts ("First");
} else {
bool win = 0, now = 0;
while (1) {
if (win ^ now) {
break;
}
rep (i, 1, n) if (a[i] > 1 && (a[i] & 1)) {
-- a[i]; break;
}
int g = 0, sum = 0;
rep (i, 1, n) g = __gcd (g, a[i]), sum += a[i];
if (g == 1) break; sum /= g;
rep (i, 1, n) a[i] /= g;
if ((sum & 1) == (n & 1)) win ^= 1; now ^= 1;
}
puts (win ? "First" : "Second");
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程