构造题哈,要先想到
2
2
2的特殊,然后再推出结果来
题目链接
题目大意
给定 n n n个整数的数组 a a a,找到一个正整数 k k k,让数组 a a a里的每一个 a [ i ] a[i] a[i]用 a [ i ] m o d k a[i]modk a[i]modk替换,使得替换后的数组内有且仅有两个不同的数
思路
已知是取模,我们发现
k
=
2
k=2
k=2在很多情况下都是适用的,除了在数组全是奇数或者偶数的情况,所以我们先针对
2
2
2来特判,如果出现两个不同的,直接输出就行了
针对全奇或全偶的形式,我们有以下推导
如果
a
[
i
]
m
o
d
k
=
x
a[i]modk=x
a[i]modk=x,那么
a
[
i
]
m
o
d
2
k
=
x
a[i]mod2k=x
a[i]mod2k=x或
a
[
i
]
m
o
d
2
k
=
x
+
k
a[i]mod2k=x+k
a[i]mod2k=x+k
所以直接枚举
k
=
2
m
k=2^m
k=2m就行了
ACcode
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
ll a[110];ll n;
bool check(ll x, ll y) {
for (ll i = 2;i <= n;i++) {
if (a[i] % x != y)return true;
}
return false;
}
void solve() {
cin >> n;
for (ll i = 1;i <= n;i++)cin >> a[i];
for (ll i = 2;;i *= 2) {
if (check(i, a[1] % i)) {
cout << i << '\n';
return;
}
}
}
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t;cin >> t;
while (t--) {
solve();
}
return 0;
}