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;
}