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;
}
标签:int,CF1656C,Make,Equal,flag,num,炫酷,include,getchar 来源: https://www.cnblogs.com/ltdjcoder/p/16053982.html