Codeforces Round 919 (Div. 2)

基本情况

A、B秒了,C属于展现短板了。

C. Partitioning the Array

\(k\) 范围不大,可以暴力。

难点就在于分组之后为了找到 \(m\) 对于每组相同位置元素的处理。

这题很明显是同余问题,但我对同余的了解也几乎就是知道同余。

找到几个数同余,可以用一个巧妙的方法。

假设这几个数对于 \(p\) 同余,那么显然这几个数除以 \(p\) 会余下相同的余数,

而直接对这几个数进行判断,很难发现他们同余(在不知道 \(p\) 的情况下)。

我们就可以利用上面的性质,既然余数相同,那么就随便选一个数,让另外几个数与这个数做差,自然做差的过程中余数被消掉了,这时再对这些差取 \(gcd\),显然就是 \(p\)

当然这题 \(p > 1\)

bool sol(int k, vector<int>& a) {
    int tot_gcd = 0;
    for (int i = 1; i <= n - k; i++) {
        tot_gcd = gcd(tot_gcd, abs(a[i + k] - a[i]));
    }
    return tot_gcd != 1;
}

void solve()
{
    cin >> n;
    vector<int> a(n + 1);
    int ans = 0;
    for (int i = 1; i <= n; i++) cin >> a[i];
    for (int i = 1; i * i <= n; i++) {
        if (n % i == 0) {
            if (i * i == n) {
                ans += sol(i, a);
            } else {
                ans += sol(i, a);
                ans += sol(n / i, a);
            }
        }
    }
    cout << ans << endl;
}
posted @ 2024-01-14 01:36  加固文明幻景  阅读(86)  评论(0编辑  收藏  举报