Codeforces Round 1011 (Div. 2)

E:
题目链接
分析:
分析发现 a a a数组和 b b b数组不能确定相对应的顺序,所以考虑整体性质( a a a数组的和与 b b b数组的和)
b b b数组分别是 a 1   m o d   k , a 2   m o d   k , a 3   m o d   k … a n   m o d   k a_1 \bmod k,a_2 \bmod k,a_3 \bmod k\dots a_n \bmod k a1modka2modka3modkanmodk
a a a数组的和减去 b b b数组的和, ( a 1 − a 1   m o d   k ) + ( a 2 − a 2   m o d   k ) + ⋯ + ( a n − a n   m o d   k ) = t 1 k + t 2 k + t 3 k + ⋯ + t n k (a_1-a_1\bmod k)+(a_2-a_2\bmod k)+\dots +(a_n- a_n\bmod k)=t_1k+t_2k+t_3k+\dots+t_nk (a1a1modk)+(a2a2modk)++(ananmodk)=t1k+t2k+t3k++tnk,令 A A A a a a数组的和、 B B B b b b数组的和、 T T T t t t数组的和, s s s A − B A-B AB s s s就是 T T T倍的 k k k s = T k s=Tk s=Tk。发现 s s s k k k的倍数也就是 k k k s s s的因数,所以枚举 s s s所有的因数判断一下这个因数满不满足条件就行了(具体见代码)
时间复杂度:
s ≤ 1 0 10 s\leq10^{10} s1010枚举所有因数时间复杂度就是 s \sqrt{s} s [ 1 , 1 0 10 ] [1,10^{10}] [11010]因数最多的数字因数有 2304 2304 2304个,时间复杂度最高为 O ( 1 0 10 + 2304 × 1 0 4 ) O(\sqrt{10^{10}}+2304\times10^{4}) O(1010 +2304×104)(具体见代码)

#include <bits/stdc++.h>

#define int long long

using namespace std;

vector<int> a, b;
int n;

bool check(int k) {
	vector<int> c(n + 1);

	for (int i = 1; i <= n; i++) c[i] = a[i] % k;
	sort(c.begin(), c.end());

	return c == b;
}

signed main() {
	int _ = 1;
	cin >> _;

	while (_ -- ) {
		int s = 0;
		cin >> n;	

		a.resize(n + 1), b.resize(n + 1);

		for (int i = 1; i <= n; i++) cin >> a[i];
		for (int i = 1; i <= n; i++) cin >> b[i];

		sort(a.begin(), a.end());
		sort(b.begin(), b.end());

		if (a == b) {
			cout << 1000010 << '\n';
			continue;
		}

		for (int i = 1; i <= n; i++) s += a[i] - b[i];

		bool t = false;

		for (int i = 1; i * i <= s; i++) {
			if (s % i == 0) {
				if (check(i)) {
					cout << i << '\n';
					t = true;
					break;
				}

				if (check(s / i)) {
					cout << s / i << '\n';
					t = true;
					break;
				}
			}
		}

		if (!t) puts("-1");
	}

	return 0;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值