AtCoder Beginner Contest 272 - G - Yet Another mod M
随机 + 数论
题意
Submission #35524126 - AtCoder Beginner Contest 272
给一个长度为 \(n\;(1<=n<=5000)\) 的数组 \(a[i]\),求一个 \(3<=M<=10^9\), 使得有 \(\lfloor\frac {n}{2}\rfloor+1\) 个数在 \(\mod M\) 意义下的值相同
思路
如果随机取两个数,都是那 \(\lfloor\frac {n}{2}\rfloor+1\) 个数的几率是 \(\frac 14\),因此大概选 1000 次,肯定会有 1 次是都在这一半数里的
对于这两个数 \(x,y\), 若在模 M 意义下相等,则 M 是 \(|x-y|\) 的因子
枚举 \(|x-y|\) 的因子作为 M,\(O(n)\) 检验是否有 \(\lfloor\frac {n}{2}\rfloor+1\) 个数模 M 意义下相同即可
若要进一步优化复杂度,可以只枚举 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的更多相关文章
- AtCoder Beginner Contest 260 G // imos(累积和算法)
题目传送门:G - Scalene Triangle Area (atcoder.jp) 题意: 给定大小为N*N的OX矩阵,若矩阵的(s,t)处为O,其覆盖范围为:满足以下条件的所有位置(i,j) ...
- AtCoder Beginner Contest 282 G - Similar Permutation
套路题 题意 求有多少个 \(1\) 到 \(n\) 的排列满足恰有 \(k\) 对在排列中相邻的数满足前小于后 \(2 \leq n \leq 500, 0 \leq k \leq (n - 1)\ ...
- AtCoder Beginner Contest 136
AtCoder Beginner Contest 136 题目链接 A - +-x 直接取\(max\)即可. Code #include <bits/stdc++.h> using na ...
- AtCoder Beginner Contest 154 题解
人生第一场 AtCoder,纪念一下 话说年后的 AtCoder 比赛怎么这么少啊(大雾 AtCoder Beginner Contest 154 题解 A - Remaining Balls We ...
- AtCoder Beginner Contest 177 题解
AtCoder Beginner Contest 177 题解 目录 AtCoder Beginner Contest 177 题解 A - Don't be late B - Substring C ...
- 题解 AtCoder Beginner Contest 168
小兔的话 欢迎大家在评论区留言哦~ AtCoder Beginner Contest 168 A - ∴ (Therefore) B - ... (Triple Dots) C - : (Colon) ...
- KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解
KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解 哦淦我已经菜到被ABC吊打了. A - Century 首先把当前年 ...
- AtCoder Beginner Contest 173 题解
AtCoder Beginner Contest 173 题解 目录 AtCoder Beginner Contest 173 题解 A - Payment B - Judge Status Summ ...
- AtCoder Beginner Contest 148 题解
目录 AtCoder Beginner Contest 148 题解 前言 A - Round One 题意 做法 程序 B - Strings with the Same Length 题意 做法 ...
- AtCoder Beginner Contest 285 解题报告
AtCoder Beginner Contest 285 解题报告 \(\text{DaiRuiChen007}\) Contest Link A. Edge Checker 2 假设 \(a\ge ...
随机推荐
- ERNIE1-2
ERNIE1.0 ERNIE: Enhanced Representation through Knowledge Integration提出了三种级别的masking:(1)word piece级别 ...
- 获取select的选中的值
var select = document.getElementById("sec")//获取元素 var idx = select.selectedIndex;//获取当前选中的 ...
- software_programming
2020-04-04 12:05:43 todo list Java8 实战2> chapter2 行为参数化 业务逻辑的隔离 DSL
- Docker部署Springboot+Vue项目
1 docker使用nginx部署vue项目 1.1 打包vue项目 npm run build vue项目路径下会增加一个dist文件夹,里面就是网页文件 1.2 使用docker 拉取nginx ...
- nvm安装及使用(windon/mac)
有必要说一下nvm,因为大家做前端对node都很熟悉吧.前端的很多项目中都依赖node,还有可能每个项目依赖的node版本不一样,这样我们就上了nvm. nvm 是node Version Manag ...
- git commit提交代码时跳过 eslint校验
在使用命令 git commit -m '提交信息' 将本地代码提交到远程仓库时候, 如果项目安装了 per-commit,则会在Git键入提交信息前进行代码风格检查,如果代码不符合相应规则,则报错. ...
- 网络爬虫Python(一)
1.爬取页面,打印页面信息 1 import requests 2 3 # get请求 4 response_get=requests.get("https://www.baidu.com& ...
- MYSQL 5.7及以上【ONLY_FULL_GROUP_BY】报错和解决方法
由于同事安装的Docker,就在docker上举例子吧,和非docker的操作方式都一样,只是路径上和重启方式可能不同 1,进入容器 docker exec -it xxxx(你的mysql容器名称) ...
- mysql学习问题解决
1.字符串转时间格式函数: STR_TO_DATE('2017-10-19 16:47:00', '%Y-%m-%d %H:%i:%s') oracle的为to_date 2.specified tw ...
- 使用layui实现分页展示数据库的数据
layui是一个前端 UI 框架,内置了js代码,所以我们可以直接使用内置的分页 首先要用到layui的官网手册https://www.layui.com/ 1.进入手册页面的 "示例&qu ...