题意:给你一个数组,你可以把数组中的数减少最多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;
}
}
}
}

  

最新文章

  1. 【High-Speed and Accurate Laser Scan Matching Using Classified Features】
  2. Winform开发框架的重要特性总结
  3. QUnit使用笔记-4保持原子性与分组
  4. 【新产品发布】《GM1001 4~20mA 高精度电流采集模块》
  5. UDF
  6. setTimeOut传参数(转)
  7. android学习日记03--常用控件button/imagebutton
  8. 理解TCP为什么需要进行三次握手
  9. Remote验证及其改进(附源码)
  10. 关于Java、Python、Go编程思想的不同
  11. debian安装dwm窗口管理器
  12. django系列4 :创建管理员
  13. edgedb 集成timescaledb
  14. 线程属性 pthread_attr_t
  15. SQL 必知必会&#183;笔记&lt;14&gt;更新和删除数据
  16. 解决Maven build 慢的问题
  17. golang学习笔记17 爬虫技术路线图,python,java,nodejs,go语言,scrapy主流框架介绍
  18. php composer 使用 以及 psr0和psr4的真正区别
  19. C#实现新建文件并写入内容
  20. linux-redhat-git源码安装

热门文章

  1. 消费者与生产者---LinkedList方式模拟
  2. Altium Designer 19 单层显示
  3. vue星级评分组件
  4. Go 数组(2)
  5. 微信小程序学习二 微信小程序的项目结构
  6. Adblock Plus 添加过滤规则
  7. springboot上传excel到oss
  8. controllerpom
  9. 2017 山东一轮集训 Day2 Shadow (三维凸包点在面上投影)
  10. HDU 6058 Kanade&#39;s sum —— 2017 Multi-University Training 3