作为竹林的粉丝来发的题解,发现在符合条件的情况下,即a数组满足单调不增,且后一位能整除前一位的情况下,对于a数组中发生降落的部分,必须使用对应的数字来进行填充,因为根据倍数填充可能不会导致gcd发生降落。

所以采用两部分进行构造,居然没有TLE

```#include <bits/stdc++.h>
#define int long long
using namespace std;
#define endl '\n'
#define pb push_back
#define ull unsigned long long
#define all(a) a.begin(), a.end()
#define vi vector<int>
#define vii vector<vector<int>>
#define fi first
#define se second
#define vs vector<string>
#define eb emplace_back
#define in insert
#define pf push_front
#define sep "================"
#define ios                      \
    ios::sync_with_stdio(false); \
    cin.tie(nullptr);                  \
    cout.tie(nullptr);
const int inf = 2e18 + 9;
const int mod1 = 1e9 + 7;
const int mod2 = 998244353;
typedef pair<int, int> pll;
typedef long double db;
inline void pt(int x)
{
    if (x < 0)
        putchar('-'), x = -x;
    if (x > 9)
        pt(x / 10);
    putchar(x % 10 + '0');
}
inline void print(int x) { pt(x), puts(""); }
inline void print(pll x) { pt(x.fi), putchar(' '), pt(x.se), putchar('\n'); }
inline void print(vi &vec)
{
    for (const auto t : vec)
        pt(t), putchar(' ');
    puts("");
}
inline void print(vector<pll> &vec)
{
    puts(sep);
    for (const auto v : vec)
    {
        print(v);
    }
    puts(sep);
}
inline int gcd(int a, int b) { return b ? gcd(b, a % b) : a; };
inline int qsm(int a, int b, int mod) ;
inline int lem(int a, int b) { return a * b / (gcd(a, b)); }
inline int lowbit(int x){return (~x + 1) & x ; }
vii mul(vii &h1, vii h2)
{
    int a1 = h1.size();
    int a2 = h2[0].size();
    int a3 = h1[0].size();
    vii ans(a1, vi(a2, 0));
    for (int i = 0; i < a1; i++)
    {
        for (int j = 0; j < a2; j++)
        {
            for (int k = 0; k < a3; k++)
            {
                ans[i][j] = (ans[i][j] + (__int128)h1[i][k] * h2[k][j]) % (mod2 - 1);
            }
        }
    }
    return ans;
}
inline int read()
{
    int x = 0;
    short f = 1;
    char c = getchar();
    while ((c < '0' || c > '9') && c != '-')
        c = getchar();
    if (c == '-')
        f = -1, c = getchar();
    while (c >= '0' && c <= '9')
        x = x * 10 + c - '0', c = getchar();
    x *= f;
    return x;
}
int per(int n, int m)
{
    if (m == 0)
    {
        return 1;
    }
    int result = 1;
    for (int i = 0; i < m; ++i)
    {
        result *= (n - i);
    }
    return result;
}
void C()
{
    const int N = 200005 + 10;
    int inv[N];
    int jie[N];
    jie[0] = 1;
    for (int i = 1; i < N; i++)
    {
        jie[i] = jie[i - 1] * i % mod1;
    }
    inv[N - 1] = qsm(jie[N - 1], mod1 - 2, mod1);
    for (int i = N - 2; i >= 0; i--)
    {
        inv[i] = inv[i + 1] * (i + 1) % mod1;
    }
}
struct ss
{
    vi t ; 
    ss() {}
    ss(int n) : t(n) {}
    void add(int x , int y)
    {
        for(int i = x ; i < t.size() ; i += lowbit(i))
        {
            t[i] += y ;
        }
    }
    int ask(int x)
    {
        int sum = 0 ; 
        for(int i = x ; i ; i -= lowbit(i))
        {
            sum += t[i] ;
        }
        return sum ; 
    }
};
// inline int comb(int n, int r){if (r < 0 || r > n)return 0;return jie[n] * inv[r] % mod1 * inv[n - r] % mod1;}
int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
int dirx[8] = {-1, -1, -1, 0, 0, 1, 1, 1};
int diry[8] = {-1, 0, 1, -1, 1, -1, 0, 1};
void init()
{
}
void work()
{ 
    int n ; cin >> n ;
    vector<queue<int>>q(n + 1) ;
    vector<bool>vis(n + 1 , false) ;
    for(int i = n ; i >= 1 ; i--)
    {
        int g = n / i ;
        for(int j = 1 ; j <= g ; j++)
        {
            q[i].push(j * i) ;
        }
    }
    vi ne(n + 1) ;
    vi a(n + 1) ; 
    for(int i = 1 ; i <= n ; i++)cin >> a[i] ;
    for(int i = 2 ; i <= n ; i++)
    {
        if(a[i] > a[i - 1] || a[i - 1]%a[i] != 0)
        {
            cout << -1 << endl ; 
            return ; 
        }
    }
    ne[1] = a[1] ;
    vis[a[1]] = true ;
    for(int i = 2 ; i <= n ; i++)
    {
        if(a[i] < a[i - 1])
        {
            ne[i] = a[i] ; 
            vis[a[i]] = true ;
        }
    }
    for(int i = 1 ; i <= n ; i++)
    {
        if(ne[i] == 0)
        {
            while(vis[q[a[i]].front()])q[a[i]].pop() ;
            if(q[a[i]].empty())
                  {
                      cout << -1 << endl ;
                      return ;
                  }
            else
            {
                ne[i] = q[a[i]].front() ; vis[ne[i]] = true ;
                q[a[i]].pop() ; 
            }
        }
    }
    for(int i = 1 ; i <= n ; i++)cout << ne[i] << " " ; 
    cout << endl ; 
}
signed main()
{
    init();
    ios;
    int dragon = 1;
    // cin >> dragon ; 
    while (dragon--)
    {
        work();
    }
    return 0;
}
inline int qsm(int a, int b, int mod)
{
    int res = 1;
    a %= mod ; 
    while (b)
    {
        if (b & 1)
        {
            res = res * a % mod;
        }
        b >>= 1;
        a = a * a % mod;
    }
    return res % mod;
}