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
a1modk,a2modk,a3modk…anmodk
让
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
(a1−a1modk)+(a2−a2modk)+⋯+(an−anmodk)=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
A−B,
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}
s≤1010枚举所有因数时间复杂度就是
s
\sqrt{s}
s,
[
1
,
1
0
10
]
[1,10^{10}]
[1,1010]因数最多的数字因数有
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;
}
1711

被折叠的 条评论
为什么被折叠?



