CF1933D-Continual Mods【数学思维】

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();
}
posted @ 2024-03-23 11:57  gebeng  阅读(76)  评论(0)    收藏  举报