Codeforces 354C 暴力 数论
2024-09-06 02:11:55
题意:给你一个数组,你可以把数组中的数减少最多k,问数组中的所有数的GCD最大是多少?
思路:容易发现,GCD的上限是数组中最小的那个数,而因为最多可以减少k,及可以凑出来的余数最大是k,那么GCD的下限是k + 1,所以当最小的数小于等于k + 1时,答案是最小的数。如果最小的数大于k + 1,我们从大到小枚举GCD,假设当前枚举的数是x,那么如果一个数在[t * x, t * x + k](t是一个常数)之间,那么就可以被凑出来,我们看一下最后凑出来的数是不是n个就可以了。我们可以用前缀和优化,这样查询区间操作是O(1)的。因为调和复杂度是nlogn的,所有可以过。
代码:
#include <bits/stdc++.h>
#define LL long long
#define INF 0x3f3f3f3f
#define db double
#define pii pair<int, int>
using namespace std;
const int maxn = 300010;
int a[maxn];
int sum[1000010];
int main() {
int n, k, mi = 1e9;
// freopen("Cin.txt", "r", stdin);
scanf("%d%d", &n, &k);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
mi = min(mi, a[i]);
}
if(mi <= k + 1) {
printf("%d\n", mi);
}
for (int i = 1; i <= n; i++) {
sum[a[i]]++;
}
for (int i = 1; i <= 1e6; i++)
sum[i] += sum[i - 1];
for (int i = mi; i >= k + 1; i--) {
int now = 0;
for (int j = 1; i * j <= 1e6; j++) {
now += sum[min(1000000, i * j + k)] - sum[i * j - 1];
if(now == n) {
printf("%d\n", i);
return 0;
}
}
}
}
最新文章
- 【High-Speed and Accurate Laser Scan Matching Using Classified Features】
- Winform开发框架的重要特性总结
- QUnit使用笔记-4保持原子性与分组
- 【新产品发布】《GM1001 4~20mA 高精度电流采集模块》
- UDF
- setTimeOut传参数(转)
- android学习日记03--常用控件button/imagebutton
- 理解TCP为什么需要进行三次握手
- Remote验证及其改进(附源码)
- 关于Java、Python、Go编程思想的不同
- debian安装dwm窗口管理器
- django系列4 :创建管理员
- edgedb 集成timescaledb
- 线程属性 pthread_attr_t
- SQL 必知必会&#183;笔记<;14>;更新和删除数据
- 解决Maven build 慢的问题
- golang学习笔记17 爬虫技术路线图,python,java,nodejs,go语言,scrapy主流框架介绍
- php composer 使用 以及 psr0和psr4的真正区别
- C#实现新建文件并写入内容
- linux-redhat-git源码安装