51nod 1421 最大MOD值(高妙的调和级数复杂度)
有一个a数组,里面有n个整数。现在要从中找到两个数字(可以是同一个) ai,aj ,使得 ai mod aj 最大并且 ai ≥ aj。
单组测试数据。
第一行包含一个整数n,表示数组a的大小。(1 ≤ n ≤ 2*10^5)
第二行有n个用空格分开的整数ai (1 ≤ ai ≤ 10^6)。
输出一个整数代表最大的mod值。
3
3 4 5
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)
代码如下:
#pragma GCC optimize("inline",3)
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int vis[],sum[],k,n,a[],cnt;
int check(int x)
{
for(register int i=;i<=cnt;++i)
{
for(register int j=a[i];j<=1e6;j+=a[i])
{
if(sum[j+a[i]-]-sum[j+x-]>)
{
return ;
}
}
}
return ;
}
int main()
{
scanf("%d",&n);
int tmp;
for(register int i=;i<=n;++i)
{
scanf("%d",&tmp);
if(!vis[tmp])
{
vis[tmp]=;
}
}
for(register int i=;i<=2e6;++i)
{
sum[i]=sum[i-]+vis[i];
}
for(int i=;i<=1e6;i++)
{
if(vis[i])
{
a[++cnt]=i;
}
}
register int l=,r=2e6,mid;
while(l<r)
{
int mid=(l+r)>>;
if(check(mid))
{
l=mid;
}
else
{
r=mid-;
}
if(r-l<=)
{
r=check(r)?r:l;
break;
}
}
printf("%d\n",r);
}
这个程序1e5跑跑是非常轻松的但是到了2e5就有点力不从心了
直接提交到51nod上就大概只能过18个点
于是考虑优化,其实只要知道了上面那个mod的定义,我们每次对于(k+1)*ai找到小于它的最大aj,那么这个aj%ai的值肯定是(k*ai,(k+1)*ai)区间内所有数%ai最大的
因此我们可以先预处理出f[i]为比i小的最大ai,然后在向上面一样枚举区间对于每个区间计算最大模数更新答案,因为省去了二分,复杂度就是O(nlogn)
代码如下:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std; int b[],a[],n,t,ans=-; int cmp(int a,int b)
{
return a>b;
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
}
sort(a+,a+n+,cmp);
int t=unique(a+,a+n+)-a-;
n=t;
int j=; for(int i=2e6;i>=;i--)
{
while(j<=n&&a[j]>=i) j++;
b[i]=a[j];
}
for(int i=;i<=n;i++)
{
for(int j=;j<=2e6/a[i];j++)
{
ans=max(ans,b[a[i]*j]%a[i]);
}
}
printf("%d\n",ans);
}
yzy大佬用set随手A掉了此题
详见这里
https://blog.csdn.net/yzyyylx/article/details/81013038
51nod 1421 最大MOD值(高妙的调和级数复杂度)的更多相关文章
- 51nod 1421 最大MOD值 | 暴力
题面 有一个a数组,里面有n个整数.现在要从中找到两个数字(可以是同一个) ai,aj ,使得 ai mod aj 最大并且 ai ≥ aj. Input 单组测试数据. 第一行包含一个整数n,表示数 ...
- 51 nod 1421 最大MOD值
1421 最大MOD值 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 有一个a数组,里面有n个整数.现在要从中找到两个数字(可以 ...
- 1421 最大MOD值
1421 最大MOD值 基准时间限制:1 秒 空间限制:131072 KB 有一个a数组,里面有n个整数.现在要从中找到两个数字(可以是同一个) ai,aj ,使得 ai mod aj 最大并且 a ...
- 51nod 1421:最大MOD值
1421 最大MOD值 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 有一个a数组,里面有n个整数.现在要从中找到两个数字(可以 ...
- 51nod1421 最大MOD值
O(n2)tle.O(nlognlogn) #include<cstdio> #include<cstring> #include<cctype> #include ...
- 51Nod 1421
1421 最大MOD值 有一个a数组,里面有n个整数.现在要从中找到两个数字(可以是同一个) ai,aj ,使得 ai mod aj 最大并且 ai ≥ aj. Input 单组测试数据. 第一行包含 ...
- 51Nod 1004 n^n的末位数字(日常复习快速幂,莫名的有毒,卡mod值)
1004 n^n的末位数字 题目来源: Author Ignatius.L (Hdu 1061) 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 给出一个整数N,输出 ...
- 关于程序设计中经常出现的INF和MOD值的设定
摘自:https://www.cnblogs.com/gfvod/p/5548313.html 在取模操作中,我们常把MOD设置为1000000007,模一个大数和模一个质数可以减少冲突,而1e9+7 ...
- 关于程序设计中INF和MOD值的设定
在取模操作中,我们常把MOD设置为1000000007 模一个大数和模一个质数可以减少冲突 而1e9+7又有一个很好的特点,就是相加不会爆int,相乘不会爆long long 在设置无穷大值时中我们常 ...
随机推荐
- 恒大威武!关于SQL的一些基础知识整理回顾
首先的首先,恒大威武! 开始正题. 关系代数: 目前主流的关系型数据库,是建立在关系代数的基础上的,即他的数学支撑是关系代数. 关系代数主要包括如下几个二目运算:并运算union.交运算interse ...
- 6、数据类型四:sets
集合的基本特征:无序,唯一. 一个redis集合最多能存放232-1个集合元素.其强大之处在于它支持集合的“交.差.并”运算,而且能够快速的判断某个给定值是否在集合中. 1.基本命令: SADD ke ...
- [转] 基于C#的波形显示控件的实现
转自 基于C#的波形显示控件的实现[附完整源码下载] 编者记: 09年暑假正好在学院实验室呆了一段时间,做了个完整的上位机软件(具体实现:根据下位机的指令,实现通过串口来操纵下位机进行实验,并将采集的 ...
- leetcode8
public class Solution { public int MyAtoi(string str) { , sign = , total = ; //1. Empty string ) { ; ...
- MySQL两个日期字段相减得到秒的方法
一.MySQL中两个DateTime字段相减 假定表名为tblName,两个DateTime字段名分别为beginDateTime,endDateTime,以下是相关两个mysql日期字段相减的SQL ...
- Python格式符说明
格式化输出 例如我想输出 我的名字是xxxx 年龄是xxxx name = "Lucy"age = 17print("我的名字是%s,年龄是%d"%(name, ...
- QT与HALCON(入门)
#include "qtdesign.h" #include <QtGui/QApplication> #include "halconcpp.h" ...
- Python nonlocal 与 global 关键字解析
nonlocal 首先,要明确 nonlocal 关键字是定义在闭包里面的.请看以下代码: x = 0 def outer(): x = 1 def inner(): x = 2 print(&quo ...
- (转)C#命名规范
C#命名规范 数据类型 数据类型简写 标准命名举例 Array arr arrShoppingList Boolean bln blnIsPostB ...
- win7下IIS的安装和配置图文教程
1. 首先是安装IIS.打开控制面板,找到”程序与功能”,点进去 2. 点击左侧”打开或关闭Windows功能” 3. 找到”Internet 信息服务”,按照下图打勾即可 等待安装完成 4. 安装完 ...
