某国的安全部门监控了全国的数据流,该部门的程序员接到一个任务,恐怖组织会给手下发送一个数字序列A,其中由n个正整数组成,而其中任何两个值Ai和Aj都可以求它们的余数
x=Ai mod Aj ,(其中1<=i,j<=n,Ai>= Aj)。
所有x中,最大的x就是破译机密的秘钥。程序员的任务就是找到这个最大的x。
输入格式:
第一行是一个正整数n,第二行由n个小于等于10610^6106的正整数组成1 ≤ n ≤ 2·10510^5105
输出格式:
输出找到的最大值。
输入样例:
3
1 3 10
输出样例:
1
思路:
假如ABCDEF,F对E、D依次取余,用 m 记录最大余数, 假如 m > C,则停止内层循环;外循环减一,让E重复该过程,如果没有找到大于M的,也在C处停止,如果找到大于M的,就可以把停止点由C调整到该位置
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int a[500010];
int main()
{
int n;
int max_mod = -9999;
int t;
scanf("%d", &n);
a[0] = 0;
for (int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
}
int m = 1;
sort(a+1, a+n+1);
for (int i = n; i >= m; i--)
{
for (int j = i-1; j >= m; j--)
{
if (a[j] != 0)
{
t = a[i] % a[j];
max_mod = t > max_mod ? t : max_mod;
if (max_mod >= a[j])
{
m = j;
break;
}
}
}
}
printf("%d", max_mod);
return 0;
}