1 条题解

  • 0
    @ 2026-5-14 13:51:51

    题目理解

    我们有两个多重集 SSTT,大小均为 nn
    可以对 SS 中的某个元素 xx 做如下操作:

    • 删除 xx,然后插入 x+kx+kxk|x-k|

    问:能否经过任意次操作,使 SS 变成 TT


    关键数学观察

    操作的本质是:
    xx 可以变成 x+kx+kxk|x-k|
    考虑 xxkk 取模:

    r=xmodkr = x \bmod k0r<k0 \le r < k)。

    • x+kx+kkk 取模仍是 rr
    • xk|x-k|kk 取模是 (kr)modk(k-r) \bmod k,即 00krk-r

    重要结论
    一个元素 xx 可以变成另一个元素 yy 当且仅当

    $$x \equiv y \pmod{k} \quad \text{或} \quad x + y \equiv 0 \pmod{k}. $$

    证明

    1. xy(modk)x \equiv y \pmod{k}
      假设 x<yx < y,可以反复执行 xx+kx \to x+k,直到变成 yy
      x>yx > y,则反复执行 xxkx \to |x-k| 并注意控制方向,可以归约到 yy

    2. x+y0(modk)x + y \equiv 0 \pmod{k}
      可以先将 xx 变成 xmodkx \bmod k(通过反复减去 kk 或变成 xk|x-k| 来调整),
      再变成 z=(k(xmodk))modkz = (k - (x \bmod k)) \bmod k,此时 zy(modk)z \equiv y \pmod{k}
      再利用情况 1 变成 yy


    化简思路

    因此,对于任意元素 xx,我们可以只关注它在模 kk 意义下的最小非负代表,但注意:

    由于 xx 可以变成 xmodkx \bmod k(k(xmodk))modk(k - (x \bmod k)) \bmod k
    这两个值中更小的那个就是它能达到的“最简形式”。

    定义:

    $$f(x) = \min(x \bmod k,\; (k - (x \bmod k)) \bmod k) $$

    为什么取 min\min
    因为 xmodkx \bmod kk(xmodk)k - (x \bmod k) 两者代表的“剩余类”在操作下是等价的(互变),所以我们统一映射到较小的那个,用于比较两个多重集是否可能相等。


    算法步骤

    1. 读入 n,kn, k 和两个多重集 AA(原 SS)和 BB(目标 TT)。
    2. AA 中每个元素 xx,计算 r=xmodkr = x \bmod k,再计算 val=min(r,kr)val = \min(r, k-r),用哈希表计数 cnt[val]++cnt[val]++
    3. BB 中每个元素 xx,同样计算 valval,然后 cnt[val]cnt[val]--
    4. 如果最终哈希表中所有计数都为 00,说明 AABB 在“最小代表”意义下匹配,输出 "YES",否则 "NO"

    为什么用随机哈希(XOR RD)

    题目中 kk 可达 10910^9valval 的范围是 0valk/20 \le val \le \lfloor k/2 \rfloor,直接用 valval 做哈希键没问题,但为了防止卡哈希(hacking 或刻意构造冲突),代码中用了一个随机数 RDRD,将键变成 valRDval \oplus RD,这样攻击者无法预知哈希函数。

    在 C++ 中,直接用 valval 也可以 AC,但加上随机化更安全。


    例子验证

    样例 3

    S=[6,2,9],  T=[8,4,11],  k=5S = [6,2,9],\; T = [8,4,11],\; k=5

    • 6mod5=16 \bmod 5 = 1min(1,4)=1\min(1,4)=1
    • 2mod5=22 \bmod 5 = 2min(2,3)=2\min(2,3)=2
    • 9mod5=49 \bmod 5 = 4min(4,1)=1\min(4,1)=1

    AA 的计数:{1:2,  2:1}\{1:2,\;2:1\}

    • 8mod5=38 \bmod 5 = 3min(3,2)=2\min(3,2)=2
    • 4mod5=44 \bmod 5 = 4min(4,1)=1\min(4,1)=1
    • 11mod5=111 \bmod 5 = 1min(1,4)=1\min(1,4)=1

    BB 的计数:{2:1,  1:2}\{2:1,\;1:2\}

    完全匹配 \to YES


    复杂度

    • 每个元素 O(1)O(1) 处理。
    • 总复杂度 O(n)O(n)
    • 满足 nn 总和 2×105\le 2\times 10^5

    最终代码(C++,无随机化简化版,易于理解)

    #include <bits/stdc++.h>
    using namespace std;
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        
        int t;
        cin >> t;
        while (t--) {
            int n, k;
            cin >> n >> k;
            vector<int> A(n), B(n);
            for (int i = 0; i < n; i++) cin >> A[i];
            for (int i = 0; i < n; i++) cin >> B[i];
            
            map<int, int> cnt;
            
            for (int x : A) {
                int r = x % k;
                cnt[min(r, k - r)]++;
            }
            
            for (int x : B) {
                int r = x % k;
                cnt[min(r, k - r)]--;
            }
            
            bool ok = true;
            for (auto& [_, v] : cnt) {
                if (v != 0) {
                    ok = false;
                    break;
                }
            }
            
            cout << (ok ? "YES" : "NO") << '\n';
        }
        
        return 0;
    }
    

    • 1

    信息

    ID
    7043
    时间
    1000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    1
    已通过
    1
    上传者