专栏文章

题解:CF2085E Serval and Modulo

CF2085E题解参与者 5已保存评论 7

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
7 条
当前快照
1 份
快照标识符
@mipnuqih
此快照首次捕获于
2025/12/03 15:03
3 个月前
此快照最后确认于
2025/12/03 15:03
3 个月前
查看原文

题目传送门

解题思路

我们考虑先分别给数组 aa 和数组 bb 排个序,此时分两种情况讨论:
  • aa 数组和 bb 数组一摸一样,这说明取模后和取模前一样,也就是说模数一定大于数组 aa 中的所有数,且 aa 中的最大值一定小于等于 10610^6,所以直接输出 10910^9 一定是对的。
  • aa 数组和 bb 数组不一样,那我们看一看取模的本质,对于 aa 数组,每个元素对 kk 取模后相当于减少了若干个 kk。此时我们对 aabb 一一对应的去看,令 ppi=1naibi\sum_{i=1}^{n} a_i - b_i,那么求出这个 pp 后,kk 一定是 pp 的因数,然后我们对于每个 pp 的因数暴力的去判断,最后不要忘了无解输出 -1
时间复杂度 O(ni=1naibilogn)O(n \sqrt{\sum_{i=1}^{n} a_i - b_i} \log n)
此时有人就会说了:啊,同学,你这个不是 101010^{10} 级别的吗,不会 T 飞吗?
但其实从 11101010^{10} 中的数的最多因子个数也就 13441344 个,不信你问 deepseek,那我们就可以把 i=1naibi\sqrt{\sum_{i=1}^{n} a_i - b_i} 最多当作 13441344 就行了,于是我们就可以轻松过掉这题了。

AC Code

CPP
#include <bits/stdc++.h>
using namespace std;

int n, a[10001], b[10001], c[10001];

bool check(int k) {
    for (int i = 1; i <= n; i++)
		c[i] = a[i] % k;
	sort(c + 1, c + n + 1);
	for (int i = 1; i <= n; i++)
		if (b[i] != c[i])
			return 0;
	return 1;
}

int main() {
    int t;
    scanf("%d", &t);
    for (; t--; ) {
        scanf("%d", &n);
        for (int i = 1; i <= n; i++)
            scanf("%d", &a[i]);
        for (int i = 1; i <= n; i++)
            scanf("%d", &b[i]);
        sort(a + 1, a + n + 1);
        sort(b + 1, b + n + 1);
        long long sum = 0;
        bool ok = 1;
        for (int i = 1; i <= n; i++) {
            sum += a[i] - b[i];
            if (a[i] != b[i])
                ok = 0;
        }
        if (ok) {
            printf("%d\n", (int)1e9);
            continue;
        }
        ok = 0;
        for (int i = 1; 1LL * i * i <= sum; i++)
            if (!(sum % i)) {
                if (check(i)) {
                    printf("%d\n", i);
                    ok = 1;
                    break;
                }
                if (i * i != sum) {
                    if (check(sum / i)) {
                        printf("%d\n", sum / i);
                        ok = 1;
                        break;
                    }
                }
            }
        if (!ok)
            printf("-1\n");
    }
}

说句闲话

这题真的有蓝吗?

评论

7 条评论,欢迎与作者交流。

正在加载评论...