1 solutions

  • 0
    @ 2024-12-2 21:25:52

    首先我们我们可以做一个桶排序,计算每个数xx出现的次数 cnt[x]cnt[x]

    然后我们枚举 xx, 我们想知道有多少对 x,yx, y 满足 y%x=ky \% x = k, 那么显然满足条件的y=k,x+k,2x+k,3x+ky = k, x + k, 2x + k, 3x + k \dots

    这样去枚举yy 类似与素数筛法去找。这样满足要求的一对x,yx, y 对答案的贡献就是 cnt[x]×cnt[y]cnt[x] \times cnt[y]

    特别注意当x=yx = y 的情况,避免重复计数。

    #include <bits/stdc++.h>
    using namespace std;
    #define int long long
    
    
    const int mod = 998244353;
    const int N = 1e6 + 10, Max = 1e6;
    int cnt[N];
    int n, k;
    signed main() {
        cin >> n >> k;
        for (int i = 1; i <= n; i++) {
            int x;
            cin >> x;
            cnt[x]++;
        }
        int ans = 0;
        for (int i = k + 1; i <= Max; i++) {
            for (int j = 0; i * j + k <= Max; j++) {
                if (i != i * j + k)
                    ans += cnt[i] * cnt[i * j + k] % mod;
                else
                    ans += cnt[i] * (cnt[i] - 1) / 2;
                ans %= mod;
            }
        }
        cout << ans << endl;
        return 0;
    }
    
    • 1

    Information

    ID
    616
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    10
    Tags
    (None)
    # Submissions
    75
    Accepted
    1
    Uploaded By