CF1656C. Make Equal With Mod

题目传送门

题意

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

题解

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

考虑一个不存在连续数字的序列, 显然可以用上述做法, 对于有相邻数字 \(n, n-1\) 时, 他们在模意义下也应该时连续的, 其中一个变为\(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 @ 2022-03-25 11:53  ltdJcoder  阅读(31)  评论(0编辑  收藏  举报