ARC188B - Symmetric Painting 题解

B - 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;
}
posted @ 2024-11-26 08:46  YipChip  阅读(8)  评论(0编辑  收藏  举报