Title

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();
}
posted @ 2023-12-25 10:24  UncleSam_Died  阅读(48)  评论(0)    收藏  举报  来源