#include <algorithm>
#include <iostream>
#include <vector>
int main() {
using namespace std;
int n;
cin >> n;
int maxv = 0;
auto arr = new int[n];
for(int i = 0; i < n; i++)
{
cin >> arr[i];
maxv = max(maxv, arr[i]);
}
vector<bool> isprime(maxv + 1, true);
vector<int> primes;
auto mfactor = new int[maxv + 1];
for(int i = 2; i <= maxv; i++)
if(isprime[i])
{
primes.push_back(i);
mfactor[i] = i;
for(int j = i * 2; j <= maxv; j += i)
{
isprime[j] = false;
mfactor[j] = i;
}
}
vector<bool> has_pf(maxv + 1, false);
auto check = [&] (const int num) {
int tmp = num;
for(auto i : primes)
{
if(i * i > num)
break;
if(tmp % i)
continue;
if(has_pf[i])
return false;
while(tmp % i == 0)
tmp /= i;
}
while(num >= has_pf.size())
has_pf.push_back(false);
if(tmp == 1)
return true;
if(has_pf[tmp])
return false;
if(tmp == num && num > primes.back())
primes.push_back(num);
return true;
};
int neq = 0;
int last = 0;
for(int i = 0; i < n; i++)
{
if(!neq)
{
int tmp = arr[i];
vector<int> set;
while(tmp != 1)
{
if(has_pf[mfactor[tmp]])
{
neq = 1;
break;
}
set.push_back(mfactor[tmp]);
tmp /= mfactor[tmp];
}
if(!neq)
{
cout << arr[i] << ' ';
for(auto j : set)
has_pf[j] = true;
}
last = arr[i];
}
if(neq)
{
int now = last + 1;
while(!check(now))
++now;
cout << now << ' ';
if(neq == 1)
last = 1;
else
last = now;
for(auto j : primes)
{
if(j * j > now)
break;
if(now % j)
continue;
if(has_pf[j])
return false;
has_pf[j] = true;
while(now % j == 0)
now /= j;
}
if(now != 1)
has_pf[now] = true;
++neq;
}
}
delete[] mfactor;
delete[] arr;
return 0;
}