CF1909B Make Almost Equal With Mod 题解
解题思路
一个很显然的结论:
- 对于所有的 $a_i$,一定存在一个数 $2^b,b\in \mathbb Z$,使得 $a_i\bmod 2^b$ 有且仅有两个不同的值。
证明如下:
- 考虑将每个 $a_i$ 转化为二进制值,那么对于 $2^b$ 取模相当于保留后 $b$ 位;
- 设第 $i$ 个数第一次出现 $1$ 的位置在 $p_i$,那么对于这个数,$[1,\dots,p_i]$ 位均为 $0$;
- 设 $mp=\min \lbrace p_1,\dots,p_n\rbrace$,那么有当 $b=mp$ 时,若干个数取模后为 $2^{b-1}$,剩余的数为 $0$。
观察 $n$ 的范围发现 $n\le 10^{18}$,因此 $mp\le63$,所以我们直接枚举就可以了。
AC 代码
#include<math.h>
#include<time.h>
#include<stdio.h>
#include<algorithm>
#define ll long long
#define N 105
#include<set>
int n,m;ll a[N],b[N],delta[N];
std::set<ll> s;
inline void work(){
scanf("%d",&n);
for(register int i=1;i<=n;++i)
scanf("%lld",&a[i]);
ll Mode=2;
while(true){s.clear();
for(register int i=1;i<=n;++i){
s.insert(a[i]%Mode);
}if(s.size()==2){
printf("%lld\n",Mode);
return;
}Mode=Mode*2;
}
}signed main(){
int T;scanf("%d",&T);
while(T--) work();
}

浙公网安备 33010602011771号