CF1656C. Make Equal With Mod

题目传送门

题意

给你一个序列, 每次可以选择一个数 x, x2, 让序列中每个数对 x 取模, 问是否可以进行若干操作使得所有数字相同

题解

考虑假如不存在 1 , 我们可以每次模最大的数, 使得所有数都为 0
如果存在 1 , 那么 1 显然永远都是 1, 所以 0,1,2 只要存在两个就寄了
然后你考虑, 是不是可以让所有数都变成 1, 对于一个 n, 我们要对n1取模才能得到1, 但如果序列中存在n1就寄了

考虑一个不存在连续数字的序列, 显然可以用上述做法, 对于有相邻数字 n,n1 时, 他们在模意义下也应该时连续的, 其中一个变为1的话, 那么另外一个要么是0, 要么是2, 不成立

话说这一场cf好多结论题啊, 炫酷是炫酷,但有点过于炫酷了.........

实现

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

int read(){
    int num=0, flag=1; char c=getchar();
    while(!isdigit(c) && c!='-') c=getchar();
    if(c == '-') c=getchar(), flag=-1;
    while(isdigit(c)) num=num*10+c-'0', c=getchar();
    return num*flag;
}

const int N = 290005;
int T, n; int a[N];

void solve(){
    int flag = 0;
    for(int i=1; i<=n; i++){
        a[i]=read();
        if(a[i] == 1) flag = 1;
    } 
    
    if(!flag){
        printf("YES\n");
        return ; 
    }else{
        sort(a+1, a+1+n);
        for(int i=2; i<=n; i++){
            if(a[i] == a[i-1]+1){
                printf("NO\n");
                return ;
            }
        }
        printf("YES\n");
    }
}

int main(){
    T = read();
    while(T--){
        n = read();
        solve();
    }
    return 0;
}
posted @   ltdJcoder  阅读(36)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示