题目大意:

给定一个包含 \(n\)(\(n\) 是偶数)个整数的数列 \(a_1,a_2,\ldots,a_n\)。

考虑一个可能的正整数 \(k\),在每次操作中,你可以选定一个 \(i\),并将 \(a_i\) 减少 \(k\)。

你可以执行任意多次(也可能是零次)操作,使这个数列中至少一半的数相等。

请找出最大的符合条件的 \(k\),如果 \(k\) 可以是任意的大小,输出 \(-1\)。

观察题目,不难发现,满足输出 \(-1\) 的充要条件就是原数列里已经至少有一半的数相等了,因此输入后我们判断一下这种情况是否存在即可。

题目中的操作,实际上就等价于让我们寻找一个最大的 \(k\),使得数列中至少有一半的数关于它同余即可。我们在数列中选出 \(a\) 和 \(b\),使得如下式子成立:

\[a\equiv b(\mod k)
\]

以此推出,得:

\[k\mid (a-b)
\]

这就说明,我们只需要枚举数列中任意两个数,将他们相减后得到的数设为 \(d\),枚举 \(d\) 的因数,寻找一个最大的因数使得数列中有至少一半的数关于它同余即可。

AC代码:

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 10000000;
int n,a[MAXN];
int t;
map<int,int> m;
int gcd(int a,int b){
if(!b){
return a;
}
return gcd(b,a % b);
}
int main(){
cin >> t;
while(t--){
m.clear();
cin >> n;
n /= 2;
for(int i = 1; i <= 2 * n; i++){
cin >> a[i];
m[a[i]]++;
}
bool flagb = 0;
for(int i = 1; i <= 2 * n; i++){
if(m[a[i]] >= n){
cout << "-1\n";
flagb = 1;
break;
}
}
if(flagb)continue;
bool flag;
int ans = 0;
for(int l = 1; l <= 2 * n; l++){
//cout << 1 << "\n";
for(int r = l + 1; r <= 2 * n; r++){
for(int j = (int)(sqrt(abs(a[l] - a[r]))) + 1; j >= 1; j--){
if(abs(a[l] - a[r]) % j == 0 && abs(a[l] - a[r]) != 0){
flag = 1;
int cnt = 0;
for(int i = 1; i <= 2 * n; i++){
if((a[i] + MAXN) % j == (a[l] + MAXN) % j)cnt++;
if(cnt == n){
ans = max(ans,j);
break;
}
}
cnt = 0;
int h = abs(a[l] - a[r]) / j;
for(int i = 1; i <= 2 * n; i++){
if((a[i] + MAXN) % h == (a[l] + MAXN) % h)cnt++;
if(cnt == n){
ans = max(ans,h);
break;
}
}
} }
}
}
cout << ans << "\n";
} return 0;
}

CF1593D2 Half of Same的更多相关文章

随机推荐

  1. Response.Write中文乱码问题

    接手别人的一个ASP项目,功能是页面按钮下载Excel导出数据. 每次导出某一天的数据会出现excel中文乱码,其他天又没问题,因为数据量比较大,所以没有逐条去检查. 找了一些资料 https://w ...

  2. SQL注入靶场

    靶场搭建 系统环境&工具 环境采用centos7的版本(纯命令行),采用一键部署平台,phpstudy工具,安装教程链接:https://www.xp.cn/linux.html#instal ...

  3. numpy学习Ⅱ

    今天有空再把numpy看一下,补充点不会的,再去看matplotlib 回顾之前笔记,发现之前的numpy学习Ⅰ中关于numpy的行.列.维可能表述有点不清晰,这里再叙述一下 import numpy ...

  4. 905. Sort Array By Parity - LeetCode

    Question 905. Sort Array By Parity Solution 题目大意:数组排序,偶数放前,奇数在后,偶数的数之间不用管顺序,奇数的数之间也不用管顺序 思路:建两个list, ...

  5. 一些GIT操作的技巧

    一.git stash 我们有时会遇到这样的情况,正在分支a上开发一半,然后分支b上发现Bug,需要马上处理.这时候分支a上的修改怎么办呢,git add 是不行的,有的git客户端版本会提示还有ad ...

  6. SQL中常用的字符串LEFT函数和RIGHT函数详解!

    今天继续整理日常可能经常遇到的一些处理字符串的函数,记得点赞收藏!以备不时之需!看到最后有惊喜! LEFT(expression, length)函数 解析:从提供的字符串的左侧开始提取给定长度的字符 ...

  7. Java 对象实现 Serializable 的原因

    java.io.Serializable 是 Java 中的一种标记接口(marker interface).标记接口是一种特殊的接口,java.io.Serializable 接口没有任何方法,也没 ...

  8. 【网站】windows phpstudy v8.1搭建https

    这两天在搭建微擎,使用了官方推荐的一键安装环境,在搭建完站点后,想开启https. 发现如下图所示,无论关闭网站,还是关闭nginx.都无法建立https.网上也找不到相关流程,后来试着关闭nginx ...

  9. JavaScript数据类型BigInt实践之id数值太大,导致前后端交互异常

    项目开发中前后端数据交互常会使用id作为主键索引,通常id数值都不大,使用number类型就可以表示处理,但对于一些分布式id或其他情况,id数值太大且超过了JS的最大处理数(Math.pow(2,  ...

  10. 2021.04.03【NOIP提高B组】模拟 总结

    T1 题目大意:求最小的 \(n\in[0,lim]\) 使得区间 \([L,R]\) 在线段树建树 \(build(0,n)\) 的区间内 考场时想到了正解,结果推式子退错了... 其实就是从下往上 ...