ARC188B - Symmetric Painting 题解
很启发的题目,考虑每次绘画的点。
-
Alice 绘画 \(-x\) 点。
-
Bob 绘画 \(2K - x\) 点。
按顺序绘画 \(0, 2K, -2K, 4K, -4K, 6K, -6K, \ldots\),由于模 \(n\) 的完全剩余系在互质的乘法中封闭,也就是说 \(N\) 与 \(2K\) 互质时可以取遍所有数。
再考虑 \(\gcd(N, 2K) \ne 1\) 时,令 \(\gcd(N, 2K) = d\)。
由于 \(\gcd\left(\frac{N}{d}, \frac{2K}{d}\right) = 1\),因此其在模 \(\frac{N}{d}\) 中取遍所有数,所以剩余系分为了 \(d\) 个封闭的集合,一个集合向另一个集合转移的充要条件是乘数与模数不互质。
而乘数始终为 \(2\),因此 \(\gcd(N, 2K) > 2\) 时,必定存在第三个集合无法到达,在经过第二个集合后,会变为 \(0\)。
考虑 \(\gcd(N, 2K) = 2\) 时什么时候可达,需要 \(2K\lfloor\frac{N}{2}\rfloor \neq \lambda N\),即 \((N - (N \bmod 2))K \neq \lambda N\),即 \(N \bmod 2 \neq 0\)。
综上可以得到题目答案。
参考代码
#include<bits/stdc++.h>
using namespace std;
void solve()
{
int n, k;
cin >> n >> k;
if (__gcd(n, k << 1) > 2) return cout << "No\n", void();
if (__gcd(n, k << 1) == 1) return cout << "Yes\n", void();
if ((n >> 1) % 2) cout << "Yes\n";
else cout << "No\n";
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int T;
cin >> T;
while (T -- ) solve();
return 0;
}