随机 + 数论

题意

Submission #35524126 - AtCoder Beginner Contest 272

给一个长度为 \(n\;(1<=n<=5000)\) 的数组 \(a[i]\),求一个 \(3<=M<=10^9\), 使得有 \(\lfloor\frac {n}{2}\rfloor+1\) 个数在 \(\mod M\) 意义下的值相同

思路

  1. 如果随机取两个数,都是那 \(\lfloor\frac {n}{2}\rfloor+1\) 个数的几率是 \(\frac 14\),因此大概选 1000 次,肯定会有 1 次是都在这一半数里的

  2. 对于这两个数 \(x,y\), 若在模 M 意义下相等,则 M 是 \(|x-y|\) 的因子

  3. 枚举 \(|x-y|\) 的因子作为 M,\(O(n)\) 检验是否有 \(\lfloor\frac {n}{2}\rfloor+1\) 个数模 M 意义下相同即可

  4. 若要进一步优化复杂度,可以只枚举 M 为 \(|x-y|\) 的素因子(如果一个数可以作为 M,那它的因子一定也可以)

    但是要注意 M 不能取 2,但可以取 4,要特判 4 可不可以;

    这里也要把 2 除干净

    while(t % 2 == 0)
    t /= 2;
    if (t > 1)
    fac.push_back(t);

代码

#include <bits/stdc++.h>
using namespace std;
#define endl "\n" typedef long long ll;
typedef pair<int, int> PII; const int N = 5e3 + 10, M = 1e5 + 10;
int a[N];
int n;
int pr[M / 5], cnt;
int p[M];
void get_primes(int n)
{
p[1] = 1;
for (int i = 2; i <= n; i++)
{
if (!p[i])
pr[++cnt] = i;
for (int j = 1; j <= cnt && pr[j] <= n / i; j++)
{
p[i * pr[j]] = pr[j];
if (p[i] == pr[j])
break;
}
}
} int solve()
{
int tmp[4];
memset(tmp, 0, sizeof tmp);
for (int i = 0; i < n; i++)
tmp[a[i] % 4]++;
for (int i = 0; i < 4; i++)
{
if (tmp[i] >= n / 2 + 1)
return 4;
}
int cnt = 10000;
while(cnt--)
{
int u, v;
u = rand() % n;
while(1)
{
v = rand() % n;
if (v != u)
break;
}
if (u > v) swap(u, v);
int t = abs(a[u] - a[v]);
vector<int> fac;
for (int i = 2; i <= cnt && pr[i] <= t / pr[i]; i++)
{
int d = pr[i];
if (t % d)
continue;
while(t % d == 0)
t /= d;
fac.push_back(d);
}
while(t % 2 == 0)
t /= 2;
if (t > 1)
fac.push_back(t);
for (auto d : fac)
{
int cnt = 2;
for (int i = 0; i < n; i++)
{
if (i == u || i == v)
continue;
if (abs(a[i] - a[u]) % d == 0)
cnt++;
}
if (cnt >= n / 2 + 1)
return d;
}
}
return -1;
}
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
srand(time(0));
get_primes(M - 10);
cin >> n;
for (int i = 0; i < n; i++)
cin >> a[i];
cout << solve() << endl;
return 0;
}

AtCoder Beginner Contest 272 - G - Yet Another mod M的更多相关文章

  1. AtCoder Beginner Contest 260 G // imos(累积和算法)

    题目传送门:G - Scalene Triangle Area (atcoder.jp) 题意: 给定大小为N*N的OX矩阵,若矩阵的(s,t)处为O,其覆盖范围为:满足以下条件的所有位置(i,j) ...

  2. AtCoder Beginner Contest 282 G - Similar Permutation

    套路题 题意 求有多少个 \(1\) 到 \(n\) 的排列满足恰有 \(k\) 对在排列中相邻的数满足前小于后 \(2 \leq n \leq 500, 0 \leq k \leq (n - 1)\ ...

  3. AtCoder Beginner Contest 136

    AtCoder Beginner Contest 136 题目链接 A - +-x 直接取\(max\)即可. Code #include <bits/stdc++.h> using na ...

  4. AtCoder Beginner Contest 154 题解

    人生第一场 AtCoder,纪念一下 话说年后的 AtCoder 比赛怎么这么少啊(大雾 AtCoder Beginner Contest 154 题解 A - Remaining Balls We ...

  5. AtCoder Beginner Contest 177 题解

    AtCoder Beginner Contest 177 题解 目录 AtCoder Beginner Contest 177 题解 A - Don't be late B - Substring C ...

  6. 题解 AtCoder Beginner Contest 168

    小兔的话 欢迎大家在评论区留言哦~ AtCoder Beginner Contest 168 A - ∴ (Therefore) B - ... (Triple Dots) C - : (Colon) ...

  7. KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解

    KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解 哦淦我已经菜到被ABC吊打了. A - Century 首先把当前年 ...

  8. AtCoder Beginner Contest 173 题解

    AtCoder Beginner Contest 173 题解 目录 AtCoder Beginner Contest 173 题解 A - Payment B - Judge Status Summ ...

  9. AtCoder Beginner Contest 148 题解

    目录 AtCoder Beginner Contest 148 题解 前言 A - Round One 题意 做法 程序 B - Strings with the Same Length 题意 做法 ...

  10. AtCoder Beginner Contest 285 解题报告

    AtCoder Beginner Contest 285 解题报告 \(\text{DaiRuiChen007}\) Contest Link A. Edge Checker 2 假设 \(a\ge ...

随机推荐

  1. springboot项目的创建和兼容jsp和注解开发,详细有效(注解和配置两种)

    如果这篇博客能给你带来帮助不胜荣幸,如果有不对的地方,都是码农欢迎指正.直接进入正题 在这里首先我要声明一下我个人的感觉如果你会ssm(spring+mybatis+springmvc)的话,那么你可 ...

  2. List<Object>集合获取指定属性最大值的对象

    List<Vo> list = dao.selectList();if(CollectionUtils.isNotEmpty(list)) { Optional<Vo> max ...

  3. SpringBoot的使用

    1. Spring Boot概述 目标:了解Spring Boot是什么,有什么作用 小结: Spring Boot是一个便捷搭建 基于spring工程的脚手架:作用是帮助开发人员快速搭建大型的spr ...

  4. MapReduce原理——切片代码分析

    (1)程序先找到数据存储的目录 (2)遍历目录对每个文件进行切片 (3)遍历一个文件: 获取文件大小 计算切片大小 默认情况下,切片大小等于blocksize 每次切片时都要判断剩下部分师否大于块的1 ...

  5. AC间二层漫游

    这个实验没有找到用packet tracer做的例子,故使用ensp,参考了文章: 配置WLAN AC间二层漫游示例 - WLAN V200R008C10 典型配置案例集 - 华为 (huawei.c ...

  6. JavaScript基础知识整理(对象的属性)

    对象的定义 无序属性的集合,属性可以包括基本值,对象或函数. JavaScript中有两类属性,数据属性和访问器属性. 特征值 JavaScript使用特征值来描述属性的行为,因为是为实现JavaSc ...

  7. iis url重写实现http 重定向到 https

    原文链接 http://www.360doc.com/content/21/0915/21/67180130_995651104.shtml 1.在iis上安装 url重写组件 2. 修改web.co ...

  8. vue3 门户网站搭建3-pinia

    引入 pinia 来方便处理全局变量. npm install pinia 1.创建 pinia 2.main 中引入(我这里是直接写的 index,所以导出的是 stores) 3.定义变量 使用: ...

  9. 【Word】通配符和特殊字符

    [Word]通配符和特殊字符 ^p 换行符 正则表达式 使用\转义,用于[]等 参考资料 Word通配符怎么用?使用Word通配符的方法

  10. mysql安装,3306端口被占用的解决办法

    如果安装mysql时,提示3306端口被占用:可以按下面步骤执行: 1.查看占用3306端口的程序 netstat -ano|findstr 3306 2.杀死该端口对应的进程 如上图,3306端口对 ...