# 484B

## Description

You are given a sequence a consisting of $n$ integers. Find the maximum possible value of $a_i$ mod $a_j$, where $1 \leq i, j \leq n$ and $a_i \geq a_j$. ($n \leq 2 \times 10^5$)

## Tutorial

Sort the sequence first. Let us iterate over all different $a_j$. Since we need to maximize, then iterate all integer $x$ (such $x$ divisible by $a_j$) in range from $2 \times a_j$ to $M$, where $M$ is the sum of the max value in the sequence and $a_j$. For each such $x$ we need to find maximum $a_i$, such $a_i < x$.

You can do this in time $O(1)$ with preprocess the answers for 1 to $10^6$. But I would rather directly use lower_bound, the time of which is $O(logN)$. After that, update answer by $a_i$ mod $a_j$.

Notably, the total time complexity is $O(NlogN + MlogMlogN)$. The iteration for all the $a_j$ and $x$ is $O(MlogM)$. Because $\sum\limits_{i=1}^{M} \frac{M}{i} \approx O(MlogM)$ which can be deducted from Euler-Mascheroni constant.

## Solution

#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
using namespace std;

#define MAX_N 200005
#define D(x)

int n;
int f[MAX_N];

void input()
{
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &f[i]);
}

int work()
{
int ret = 0;
for (int i = 0; i < n; i++)
{
for (int j = 2; j * f[i] <= f[n - 1] + f[i]; j++)
{
int temp = *(lower_bound(f, f + n, f[i] * j) - 1);
ret = max(ret, temp % f[i]);
}
}
return ret;
}

int main()
{
input();
sort(f, f + n);
n = unique(f, f + n) - f;
printf("%d\n", work());
return 0;
}