随机 + 数论

题意

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;
}

最新文章

  1. OpenGl在VS中的配置
  2. [Aaronyang] 写给自己的WPF4.5 笔记20 [3d课 1/4]
  3. 寻找“水王”--c++
  4. Lucene子项目------------------Solr遇到的问题
  5. jQuery--checkbox全选/取消全选
  6. Ubuntu - Dconf 注册表键值修改参考表
  7. python web开发-flask中消息闪现flash的应用
  8. Webpack模块的导出以及之间的依赖引用
  9. opensuse 使用xx-net
  10. lightoj 1282 取对数的操作
  11. RabbitMQ 延时消息设计
  12. OC相机封装
  13. Web开发相关笔记 #04# WebSocket
  14. WPS处理个人信息一种方法
  15. javascript跟随滚动效果插件代码(javascript Follow Plugin)
  16. devstack screen 详解
  17. combotree的总结(这个好)
  18. css整站规划
  19. Selenium+Python学习之一
  20. C++ const引用

热门文章

  1. javaweb常用的配置文件
  2. java SE01
  3. iOS第三方库汇总(转)
  4. VUE如何创建一个项目
  5. db2 linux创建用户后,登录报错
  6. WCF学习系列---1、新建第一个WCF服务
  7. shell_Day09
  8. uni-app学习笔记之----不同平台,独立设置
  9. vs code 提交代码弹框提示:请确保已在git中配置您的“user.name”和“user.email” ——解决方法
  10. docker 运行环境