CF1933D-Continual Mods【数学思维】
一、题目大意
题目链接
https://codeforces.com/contest/1933/problem/D
给定一个长度为n的数组a,可以任意改变a的顺序,变成数组b(也可以不改变)!
问是否存在一个这样的b,使得\(b_1\) mod \(b_2\) mod ... mod \(b_n\) ≠ 0。(注意,是从左往右依次算的)
二、题目思路
什么情况下,会出现等于0的情况?
当从前往后算,出现,\(b_{i - 1}\) % $ b_i$ = 0的情况,那么 \(b_i\) 之后的元素不管怎么算就都是0, 0 % x = 0!
当 \(b_{i-1} < b_i\) 时,\(b_{i-1}\) % \(b_{i}\) = \(b_{i - 1}\) ≠ 0。
如果找到 \(b\) 中的最小值\(b_{min}\),且最小值唯一的话,那么将这个最小值放在最前面,最后的值一定时 \(b_{min}\)!
那么,如果不唯一的话,又该怎么办呢?
看可不可以创造一个出来,将其他值 \(b_{other}\) % \(b_{min}\) ,如果不为0,那么就得到一个唯一的比 \(b_{min}\) 还要小的最小值!
否则的话,必然会出现两个最小值 \(b_{min}\) % \(b_{min}\) = 0的情况,就一定不存在符合条件的b数组,就输出\(NO\)
三、代码展示
#include<bits/stdc++.h>
const int N = 1e5 + 5;
using namespace std;
int n,t;
int a[N];
void solve()
{
cin >> n;
for(int i = 1;i <= n;++i) cin >> a[i];
int mi = *min_element(a + 1,a + 1 + n);
if(count(a + 1,a + 1 + n,mi) == 1) {
cout << "YES" << '\n';
return;
}
for(int i = 1;i <= n;++i){
if(a[i] % mi != 0){
cout << "YES" << '\n';
return;
}
}
cout << "NO" << '\n';
}
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin >> t;
for(int _ = 0;_ < t;++_) solve();
}
标签:Mods,min,int,CF1933D,最小值,Continual,mod
From: https://www.cnblogs.com/gebeng/p/18090943