Submission #369951

#TimeUsernameProblemLanguageResultExecution timeMemory
369951nicolaalexandraNice sequence (IZhO18_sequence)C++14
100 / 100
1150 ms86124 KiB
#include <bits/stdc++.h>
#define DIM 2000010
using namespace std;

vector <int> L[DIM];
int v[DIM],g[DIM];
int n,m,k,t,i,j,idx,ok;

void dfs (int nod, int k){
    v[nod] = ++idx;

    if (nod >= n){
        if (!v[nod-n])
            dfs (nod-n,k);
        else ok = 0;
    }

    if (nod + m <= k){
        if (!v[nod+m])
            dfs (nod+m,k);
        else ok = 0;
    }

}

int verif (int k){
    int i;

    for (i=0;i<=k;i++)
        v[i] = g[i] = 0;

    for (i=1;i<=k;i++){
        if (i >= n)
            ++g[i-n];
        if (i >= m)
            ++g[i];
    }

    idx = 0, ok = 1;
    for (i=0;i<=k;++i){
        if (!g[i]){
            dfs (i,k);
            if (!ok)
                return 0;
        }}

    if (!idx)
        return 0;

    for (i=1;i<=k;++i){
        if (i >= n && v[i] >= v[i-n])
            return 0;
        if (i >= m && v[i] <= v[i-m])
            return 0;
    }

    return 1;
}

int main (){

    ios_base::sync_with_stdio(false);

    //ifstream cin ("date.in");
    //ofstream cout ("date.out");

    cin>>t;
    for (;t--;){
        cin>>n>>m;
        if (n % m == 0){
            cout<<n-1<<"\n";
            for (i=1;i<=n-1;++i)
                cout<<"1 ";
            if (n > 1)
                cout<<"\n";
            continue;
        }

        if (m % n == 0){
            cout<<m-1<<"\n";
            for (i=1;i<=m-1;++i)
                cout<<"-1 ";
            if (m > 1)
                cout<<"\n";
            continue;
        }

        int st = min(n,m)-1, dr = 400000, sol = 0;
        while (st <= dr){
            int mid = (st+dr)>>1;
            if (verif(mid)){
                sol = mid;
                st = mid+1;
            } else dr = mid-1;
        }

        verif (sol);

        cout<<sol<<"\n";
        for (i=1;i<=sol;++i)
            cout<<v[i]-v[i-1]<<" ";
        if (sol)
            cout<<"\n";
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...