Title

CF1909B Make Almost Equal With Mod 题解

解题思路

一个很显然的结论:

  • 对于所有的 ai,一定存在一个数 2b,bZ,使得 aimod2b 有且仅有两个不同的值。

证明如下:

  • 考虑将每个 ai 转化为二进制值,那么对于 2b 取模相当于保留后 b 位;
  • 设第 i 个数第一次出现 1 的位置在 pi,那么对于这个数,[1,,pi] 位均为 0
  • mp=min{p1,,pn},那么有当 b=mp 时,若干个数取模后为 2b1,剩余的数为 0

观察 n 的范围发现 n1018,因此 mp63,所以我们直接枚举就可以了。

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 @   UncleSam_Died  阅读(27)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示