有一个a数组,里面有n个整数。现在要从中找到两个数字(可以是同一个) ai,aj ,使得 ai mod aj 最大并且 ai ≥ aj。

Input
  1. 单组测试数据。
  2. 第一行包含一个整数n,表示数组a的大小。(1  n  2*10^5)
  3. 第二行有n个用空格分开的整数ai (1  ai  10^6)。
Output
  1. 输出一个整数代表最大的mod值。
Input示例
  1. 3
  2. 3 4 5
Output示例
  1. 2
  2. 题解:首先考虑mod的真正定义
    a%b=a/b*b+c
    思考一下其实是kb+c的形式,画在数轴上就是

很显然,如果有一个数x%a>b%a他肯定会在(k*a+b,(k+1)*a)的区间之中,到底有没有这些数存在可以用前缀和O(1)查询

所以因此我们就可以对c即余数进行二分了,不过二分的时候检验是O(nlogn)的,因为会枚举每一个数的倍数的区间,总复杂度大约是调和级数即logn 但其实仔细一想这是不满的

在套上二分,复杂度是O(nlognlogn) 

代码如下:

  1. #pragma GCC optimize("inline",3)
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<algorithm>
  6. using namespace std;
  7. int vis[],sum[],k,n,a[],cnt;
  8. int check(int x)
  9. {
  10. for(register int i=;i<=cnt;++i)
  11. {
  12. for(register int j=a[i];j<=1e6;j+=a[i])
  13. {
  14. if(sum[j+a[i]-]-sum[j+x-]>)
  15. {
  16. return ;
  17. }
  18. }
  19. }
  20. return ;
  21. }
  22. int main()
  23. {
  24. scanf("%d",&n);
  25. int tmp;
  26. for(register int i=;i<=n;++i)
  27. {
  28. scanf("%d",&tmp);
  29. if(!vis[tmp])
  30. {
  31. vis[tmp]=;
  32. }
  33. }
  34. for(register int i=;i<=2e6;++i)
  35. {
  36. sum[i]=sum[i-]+vis[i];
  37. }
  38. for(int i=;i<=1e6;i++)
  39. {
  40. if(vis[i])
  41. {
  42. a[++cnt]=i;
  43. }
  44. }
  45. register int l=,r=2e6,mid;
  46. while(l<r)
  47. {
  48. int mid=(l+r)>>;
  49. if(check(mid))
  50. {
  51. l=mid;
  52. }
  53. else
  54. {
  55. r=mid-;
  56. }
  57. if(r-l<=)
  58. {
  59. r=check(r)?r:l;
  60. break;
  61. }
  62. }
  63. printf("%d\n",r);
  64. }

这个程序1e5跑跑是非常轻松的但是到了2e5就有点力不从心了

直接提交到51nod上就大概只能过18个点

于是考虑优化,其实只要知道了上面那个mod的定义,我们每次对于(k+1)*ai找到小于它的最大aj,那么这个aj%ai的值肯定是(k*ai,(k+1)*ai)区间内所有数%ai最大的

因此我们可以先预处理出f[i]为比i小的最大ai,然后在向上面一样枚举区间对于每个区间计算最大模数更新答案,因为省去了二分,复杂度就是O(nlogn)

代码如下:

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. int b[],a[],n,t,ans=-;
  7. int cmp(int a,int b)
  8. {
  9. return a>b;
  10. }
  11. int main()
  12. {
  13. scanf("%d",&n);
  14. for(int i=;i<=n;i++)
  15. {
  16. scanf("%d",&a[i]);
  17. }
  18. sort(a+,a+n+,cmp);
  19. int t=unique(a+,a+n+)-a-;
  20. n=t;
  21. int j=;
  22. for(int i=2e6;i>=;i--)
  23. {
  24. while(j<=n&&a[j]>=i) j++;
  25. b[i]=a[j];
  26. }
  27. for(int i=;i<=n;i++)
  28. {
  29. for(int j=;j<=2e6/a[i];j++)
  30. {
  31. ans=max(ans,b[a[i]*j]%a[i]);
  32. }
  33. }
  34. printf("%d\n",ans);
  35. }
  1.  
  2. yzy大佬用set随手A掉了此题
    详见这里
    https://blog.csdn.net/yzyyylx/article/details/81013038

51nod 1421 最大MOD值(高妙的调和级数复杂度)的更多相关文章

  1. 51nod 1421 最大MOD值 | 暴力

    题面 有一个a数组,里面有n个整数.现在要从中找到两个数字(可以是同一个) ai,aj ,使得 ai mod aj 最大并且 ai ≥ aj. Input 单组测试数据. 第一行包含一个整数n,表示数 ...

  2. 51 nod 1421 最大MOD值

    1421 最大MOD值 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 有一个a数组,里面有n个整数.现在要从中找到两个数字(可以 ...

  3. 1421 最大MOD值

    1421 最大MOD值 基准时间限制:1 秒 空间限制:131072 KB  有一个a数组,里面有n个整数.现在要从中找到两个数字(可以是同一个) ai,aj ,使得 ai mod aj 最大并且 a ...

  4. 51nod 1421:最大MOD值

    1421 最大MOD值 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 有一个a数组,里面有n个整数.现在要从中找到两个数字(可以 ...

  5. 51nod1421 最大MOD值

    O(n2)tle.O(nlognlogn) #include<cstdio> #include<cstring> #include<cctype> #include ...

  6. 51Nod 1421

    1421 最大MOD值 有一个a数组,里面有n个整数.现在要从中找到两个数字(可以是同一个) ai,aj ,使得 ai mod aj 最大并且 ai ≥ aj. Input 单组测试数据. 第一行包含 ...

  7. 51Nod 1004 n^n的末位数字(日常复习快速幂,莫名的有毒,卡mod值)

    1004 n^n的末位数字 题目来源: Author Ignatius.L (Hdu 1061) 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 给出一个整数N,输出 ...

  8. 关于程序设计中经常出现的INF和MOD值的设定

    摘自:https://www.cnblogs.com/gfvod/p/5548313.html 在取模操作中,我们常把MOD设置为1000000007,模一个大数和模一个质数可以减少冲突,而1e9+7 ...

  9. 关于程序设计中INF和MOD值的设定

    在取模操作中,我们常把MOD设置为1000000007 模一个大数和模一个质数可以减少冲突 而1e9+7又有一个很好的特点,就是相加不会爆int,相乘不会爆long long 在设置无穷大值时中我们常 ...

随机推荐

  1. node启动appium.js

    node启动appium.js,appium.js目录中不能有空格或者(x86)等字样

  2. CentOS7修改ssh端口

    http://www.cnblogs.com/rwxwsblog/p/5756894.html 修改/etc/ssh/sshd_config vi /etc/ssh/sshd_config #Port ...

  3. pandas 读取excle ,迭代

    # -*-coding:utf-8 -*- import pandas as pd xls_file=pd.ExcelFile('D:\python_pro\\address_list.xlsx') ...

  4. Linux Centos 7 RabbitMQ 安装

    下载地址:http://www.rabbitmq.com/releases/rabbitmq-server/ 找到rabbitmq-server-3.6.15-1.el7.noarch.rpm 第一步 ...

  5. javaWeb 开发的成长路线

    感觉最近技术到了一个瓶颈,好长时间没有感觉进步了,本着活到老学到老的态度,笔者就去逛了下,看看前辈们写的文章,觉得他们写的非常不错,在这里特别贴出一张特别值得收藏的图片,不是说其他总结的图片不值得收藏 ...

  6. BMP文件结构(转)

    [转自网络] BMP文件存储结构的格式可以在Windows中的WINGDI.h文件中找到定义. BMP文件总体上由4部分组成,分别是位图文件头.位图信息头.调色板和图像数据,如表5-1所示. 表5-1 ...

  7. 【309】◀▶ Windows 相关功能实现

    目录: 共享文件夹失败的解决方法 导 栅 添 1. 共享文件夹失败的解决方法 参考:解决“你没有权限访问,请与网络管理员联系” 参考:WIN7局域网文件共享设置方法 2. 导 在 3. 栅 栅 4. ...

  8. 重构--去除丑陋的switch语句

    最近几天,在进行重构的时候,遇到了一个极其丑陋的代码(自己写的 /捂脸  当时时间紧,于是....),今天去重构的时候无论如何也想不出方法,去除这个丑陋的switch语句 ,于是写篇博客,让自己记住这 ...

  9. PHP - 用户异常断开连接,脚本强制继续执行,异常退出回调

    试想如下情况.如果你的用户正在执行一个需要非常长的执行时间的操作.他点了执行了之后,浏览器就开始蛋疼地转.如果执行5分钟,你猜他会干啥,显然会觉得什么狗屎垃圾站,这么久都不响应,然后就给关了.当然这个 ...

  10. Maven详解【面试+工作】 各种安装 没用

    1 Maven介绍1.1 项目开发中遇到的问题 1.都是同样的代码,为什么在我的机器上可以编译执行,而在他的机器上就不行? 2.为什么在我的机器上可以正常打包,而配置管理员却打不出来? 3.项目组加入 ...