[乱搞]51 Nod 1421——最大MOD值
2017-10-21 11:25
495 查看
题目描述
有一个a数组,里面有n个整数。现在要从中找到两个数字(可以是同一个) ai,aj ,使得 ai mod aj 最大并且 ai ≥ aj。解题思路
对于每个数字,有n/ai个区间,每个区间是[1+ai∗(k−1),ai∗k]显然对于每个区间只有最接近这个区间末边界的值会更新答案。
提前预处理一下就可以了。
ps:我预处理有log的,其实不需要log。
#include<cstdio> #include<algorithm> using namespace std; char nc(){ static char buf[100000],*l=buf,*r=buf; if (l==r) r=(l=buf)+fread(buf,1,100000,stdin); if (l==r) return EOF;return *l++; } inline int _read(){ int num=0;char ch=nc(); while(ch<'0'||ch>'9') ch=nc(); while(ch>='0'&&ch<='9') num=num*10+ch-48,ch=nc(); return num; } const int maxn=2000005; int n,a[maxn],lst[maxn],ans; bool vis[maxn]; int main(){ freopen("exam.in","r",stdin); freopen("exam.out","w",stdout); n=_read(); for (int i=1;i<=n;i++) a[i]=_read(); sort(a+1,a+1+n); int now=1; for (int i=1;i<=2000000;i++){ while(now<=n&&a[now]<i) now++; lst[i]=a[now-1];//printf("%d\n",lst[i]); } for (int i=1;i<=n;i++)if (!vis[a[i]]){ for (int j=a[i];j<=2000000;j+=a[i]) if (lst[j]>=a[i]&&lst[j]%a[i]>ans) ans=lst[j]%a[i]; vis[a[i]]=1; } printf("%d\n",ans); return 0; }
相关文章推荐
- 51 nod 1421 最大MOD值
- 51 Nod 1008 N的阶乘 mod P【Java大数乱搞】
- 51 nod 1158 全是1的最大子矩阵(单调栈)
- (51nod)1011 - 最大公约数GCD
- 51 nod 循环最大字段和 DP
- 51-Nod 2006 飞行员配对(二分图最大匹配)
- [二分+最大流]51 Nod——1757 大灾变
- 51nod 1421 最大MOD值 (暴力枚举)
- 51 nod 1270 数组最大代价
- 51nod-1421 最大MOD值
- 51 nod 1188 最大公约数之和 V2
- 51 nod 1254 最大子段和 V2(思维)
- 最大子段和(51Nod 1049)、最小正子段和(51Nod 1065)、总结(最小子段和、最大子段和、最小正子段和)
- 51 Nod 1051 最大子矩阵和 (DP)
- [51Nod](1049)最大子段和 ---- 思维
- 51 nod 1179 最大的最大公约数
- 51 nod 1292 字符串中的最大值 V2(后缀数组)
- [乱搞]51 Nod 1859—Clarke and number
- 51 nod 1277 字符串中的最大值(KMP)
- 51nod 1421:最大MOD值