Codeforces Round 929 (Div. 3) D. Turtle Tenacity: Continual Mods(数学,贪心)

2024-03-17 18:12

本文主要是介绍Codeforces Round 929 (Div. 3) D. Turtle Tenacity: Continual Mods(数学,贪心),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

给定数组 a 1 , a 2 , … , a n a_1,a_2,…,a_n a1,a2,,an ,判断是否有可能将其元素重排为 b 1 , b 2 , … , b n b_1,b_2,…,b_n b1,b2,,bn ,从而得到 b 1 b_1 b1 m o d mod mod b 2 b_2 b2 m o d mod mod m o d mod mod b n b_n bn ≠ ≠ = 0 0 0

这里的 x x x m o d mod mod y y y 表示 x x x 除以 y y y 的余数。另外,模运算是从左向右计算的。即 x x x m o d mod mod y y y m o d mod mod z z z = = = ( x (x (x m o d mod mod y ) y) y) m o d mod mod z z z 。例如, 2024 2024 2024 m o d mod mod 1000 1000 1000 m o d mod mod 8 8 8 = = = ( 2024 (2024 (2024 m o d mod mod 1000 ) 1000) 1000) m o d mod mod 8 8 8 = = = 24 24 24 m o d mod mod 8 8 8 = = = 0 0 0

输入
输入的第一行包含一个整数 t ( 1 ≤ t ≤ 1 0 4 ) t ( 1≤t≤10^4 ) t(1t104) - 测试用例的数量。

每个测试用例的第一行包含一个整数 n ( 2 ≤ n ≤ 1 0 5 ) n ( 2≤n≤10^5 ) n(2n105)

每个测试用例的第二行包含 n n n 个整数 a 1 , a 2 , … , a n ( 1 ≤ a i ≤ 1 0 9 ) ( 1 ≤ a i ≤ 1 0 9 ) a_1,a_2,…,a_n ( 1≤a_i≤10^9 )( 1≤a_i≤10^9 ) a1,a2,,an(1ai109)(1ai109).

所有测试用例的 n n n 之和不超过 2 ⋅ 1 0 5 2⋅10^5 2105

输出
对于每个测试用例,如果可能,则输出 “YES”,否则输出 “NO”。

您可以用任何大小写(大写或小写)输出答案。例如,字符串 “yEs”、“yes”、"Yes "和 "YES "将被识别为肯定回答。

Example
input

8
6
1 2 3 4 5 6
5
3 3 3 3 3
3
2 2 3
5
1 1 2 3 7
3
1 2 2
3
1 1 2
6
5 2 10 10 10 2
4
3 6 9 3

output

YES
NO
YES
NO
YES
NO
YES
NO

乍一拿到这道题可能觉得莫名其妙,因为给定一个数组进行随意的排列能排出来无数种(别管具体多少种,反正会爆)排法,所以这题必定有规律可循(废话)。

那么来思考:最终mod出来的数是不是0究竟取决于谁呢?

  • 假如现在有一个最小数为1,后面的数都是大于1的,比如什么 2 2 2 5 5 5 3 3 3 5 5 5 2 2 2 8 8 8 7 7 7 4 4 4…,那么最后 m o d mod mod 得出来是什么呢 ? 稍微思考一下就知道 1 1 1 m o d mod mod 2 2 2 = = = 1 1 1, 1 1 1 m o d mod mod 5 5 5 = = = 1 1 1, 1 1 1 m o d mod mod 3 3 3 = = = 1 1 1…,到最后 m o d mod mod 出来肯定还是个 1 1 1,因为加了前提条件: 1 1 1 就是这些数里的最小值,并且 1 1 1 唯一。当然有别的序列以 2 2 2 为最小数且唯一,以 3 3 3 为最小数且唯一 … 得到的结论同样还是这样,所以只要序列中有一个唯一的最小值,那么最终得到的模数一定非0
  • 那如果最小值不唯一呢 ?就比如样例4:1 1 2 3 7。如果直接从前mod到最后一定是0,因为1 mod 1 = 0,在第一步就0了。但是再去看倒数第二个样例 5 2 10 10 10 2,为啥这个就是对的 ? 假如我们只有2 10 10 10 2,没有第一个 5 ,那么就能得到:不管怎么排,到最后都只能 mod 出来个 0 ,那如果加上 5 ,2 mod 5 = 3,而 3 mod 到最后都不可能是 0 ,因为 3 和其他任何一个数都不是倍数关系,所以如果除了最小值之外如果有任何一个值是和最小值不成倍数的,那么这个序列就一定有一种方法可以排成最终模数不是0

来一个 不严谨 的证明:
设最小值为m,那么除了和 m m m 相同的数之外,能够有的就只有:是 m m m 的倍数的数,不是 m m m 的倍数的数。

假如这里有一个序列:

m  1*m  a*m   b*m    e*(m+n)(n < m)

集结所有种类的数,那么我们肯定可以让 e ∗ ( m + n ) e*(m + n) e(m+n) m o d mod mod m m m 得到 e ∗ n e*n en
之后因为其他数都是m的倍数,而 e ∗ n e*n en 一定不是 m m m 的倍数,所以 e ∗ n e*n en m o d mod mod 其他所有数出来都一定不是 0 0 0。那么最后得到的模数就一定不为0。

代码:

#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
const int N = 1e5 + 10;int a[N];int main() {int t; cin >> t;while (t--) {int n; cin >> n;bool has_answer = 0;for (int i = 1; i <= n; i++) {cin >> a[i];}sort(a + 1, a + n + 1); //这里找最小值可以直接利用排序if (a[1] == a[2]) {for (int i = 2; i <= n; i++) {if (a[i] % a[1] != 0) {has_answer = 1;break;}}}else {has_answer = 1;}if (has_answer)cout << "YES" << endl;else cout << "NO" << endl;}return 0;
}

这篇关于Codeforces Round 929 (Div. 3) D. Turtle Tenacity: Continual Mods(数学,贪心)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/819735

相关文章

usaco 1.3 Barn Repair(贪心)

思路:用上M块木板时有 M-1 个间隙。目标是让总间隙最大。将相邻两个有牛的牛棚之间间隔的牛棚数排序,选取最大的M-1个作为间隙,其余地方用木板盖住。 做法: 1.若,板(M) 的数目大于或等于 牛棚中有牛的数目(C),则 目测 给每个牛牛发一个板就为最小的需求~ 2.否则,先对 牛牛们的门牌号排序,然后 用一个数组 blank[ ] 记录两门牌号之间的距离,然后 用数组 an

uva 10014 Simple calculations(数学推导)

直接按照题意来推导最后的结果就行了。 开始的时候只做到了第一个推导,第二次没有继续下去。 代码: #include<stdio.h>int main(){int T, n, i;double a, aa, sum, temp, ans;scanf("%d", &T);while(T--){scanf("%d", &n);scanf("%lf", &first);scanf

uva 10025 The ? 1 ? 2 ? ... ? n = k problem(数学)

题意是    ?  1  ?  2  ?  ...  ?  n = k 式子中给k,? 处可以填 + 也可以填 - ,问最小满足条件的n。 e.g k = 12  - 1 + 2 + 3 + 4 + 5 + 6 - 7 = 12 with n = 7。 先给证明,令 S(n) = 1 + 2 + 3 + 4 + 5 + .... + n 暴搜n,搜出当 S(n) >=

uva 11044 Searching for Nessy(小学数学)

题意是给出一个n*m的格子,求出里面有多少个不重合的九宫格。 (rows / 3) * (columns / 3) K.o 代码: #include <stdio.h>int main(){int ncase;scanf("%d", &ncase);while (ncase--){int rows, columns;scanf("%d%d", &rows, &col

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

poj 3190 优先队列+贪心

题意: 有n头牛,分别给他们挤奶的时间。 然后每头牛挤奶的时候都要在一个stall里面,并且每个stall每次只能占用一头牛。 问最少需要多少个stall,并输出每头牛所在的stall。 e.g 样例: INPUT: 51 102 43 65 84 7 OUTPUT: 412324 HINT: Explanation of the s

poj 2976 分数规划二分贪心(部分对总体的贡献度) poj 3111

poj 2976: 题意: 在n场考试中,每场考试共有b题,答对的题目有a题。 允许去掉k场考试,求能达到的最高正确率是多少。 解析: 假设已知准确率为x,则每场考试对于准确率的贡献值为: a - b * x,将贡献值大的排序排在前面舍弃掉后k个。 然后二分x就行了。 代码: #include <iostream>#include <cstdio>#incl

Codeforces Round #240 (Div. 2) E分治算法探究1

Codeforces Round #240 (Div. 2) E  http://codeforces.com/contest/415/problem/E 2^n个数,每次操作将其分成2^q份,对于每一份内部的数进行翻转(逆序),每次操作完后输出操作后新序列的逆序对数。 图一:  划分子问题。 图二: 分而治之,=>  合并 。 图三: 回溯:

Codeforces Round #261 (Div. 2)小记

A  XX注意最后输出满足条件,我也不知道为什么写的这么长。 #define X first#define Y secondvector<pair<int , int> > a ;int can(pair<int , int> c){return -1000 <= c.X && c.X <= 1000&& -1000 <= c.Y && c.Y <= 1000 ;}int m

Codeforces Beta Round #47 C凸包 (最终写法)

题意慢慢看。 typedef long long LL ;int cmp(double x){if(fabs(x) < 1e-8) return 0 ;return x > 0 ? 1 : -1 ;}struct point{double x , y ;point(){}point(double _x , double _y):x(_x) , y(_y){}point op