제출 #1347384

#제출 시각아이디문제언어결과실행 시간메모리
1347384NHristovPresent (RMI21_present)C++20
100 / 100
35 ms46604 KiB
#include <bits/stdc++.h>
#define endl '\n'

using namespace std;

const int N=38, MSK=(1<<(N/2));

int g[N+1][N+1], mx[MSK], hlp[N/2], dp[N/2+1][MSK], bad1[MSK];
bool good0[MSK], good1[MSK];

void pre() {
    for(int i=0; i<=N; i++) {
        for(int q=0; q<=N; q++) {
            if(i>q)
                g[i][q]=g[q][i];
            else {
                if(i==0)
                    g[i][q]=q;
                else
                    g[i][q]=g[q%i][i];
            }
        }
    }
    good1[0]=1, bad1[0]=0;
    for(int m=1; m<MSK; m++) {
        int cnt=0;
        while((1<<(cnt+1))<=m)
            cnt++;
        mx[m]=cnt;
    }
    for(int i=0; i<N/2; i++) {
        int nw=2*i+1;
        good1[1<<i]=1;
        for(int m=1; m<(1<<i); m++) {
            int nm=m|(1<<i), b1=mx[m];
            good1[nm]=good1[m]&&good1[nm^(1<<b1)]&&(m&(1<<(g[2*b1+1][nw]/2)))!=0;
        }
        for(int q=0; q<N/2; q++) {
            hlp[q]=0;
            for(int j=0; j<N/2; j++) {
                if(g[nw][2*j+2]==2*q+1)
                    hlp[q]|=(1<<j);
            }
        }
        for(int m=(1<<i)-2; m>=0; m--) {
            int nm=m|(1<<i), b1=mx[((1<<i)-1)^m];
            bad1[nm]=bad1[nm^(1<<b1)]|hlp[b1];
        }
        for(int m=0; m<(1<<i); m++) {
            int nm=m|(1<<i);
            bad1[nm]|=bad1[m];
        }
    }
    good0[0]=1;
    for(int i=0; i<N/2; i++) {
        int nw=2*i+2;
        good0[1<<i]=1;
        for(int m=1; m<(1<<i); m++) {
            int nm=m|(1<<i), b1=mx[m];
            good0[nm]=good0[m]&&good0[nm^(1<<b1)]&&(m&(1<<(g[2*b1+2][nw]/2-1)))!=0;
        }
    }
    for(int m=0; m<(1<<(N/2)); m++)
        dp[0][m]=good0[m];
    for(int i=1; i<=N/2; i++) {
        for(int m=0; m<(1<<(N/2)); m++) {
            dp[i][m]=dp[i-1][m];
            if((m&(1<<(i-1)))!=0)
                dp[i][m]+=dp[i-1][m^(1<<(i-1))];
        }
    }
}
void slv(int k) {
    int all=0, ans0=0, ans1=0;
    for(int i=N/2-1; i>=0; i--) {
        int cnt[2][2]={ }, do0=ans0|(1<<i), do1=ans1|(1<<i);
        for(int add=0; add<(1<<i); add++) {
            if(good1[ans0|add]&&(bad1[ans0|add]&ans1)==0)
                cnt[0][0]+=dp[i][ans1|(((1<<i)-1)&~bad1[ans0|add])];
            if(good1[do0|add]&&(bad1[do0|add]&ans1)==0)
                cnt[0][1]+=dp[i][ans1|(((1<<i)-1)&~bad1[do0|add])];
            if(good1[ans0|add]&&(bad1[ans0|add]&do1)==0)
                cnt[1][0]+=dp[i][do1|(((1<<i)-1)&~bad1[ans0|add])];
            if(good1[do0|add]&&(bad1[do0|add]&do1)==0)
                cnt[1][1]+=dp[i][do1|(((1<<i)-1)&~bad1[do0|add])];
        }
        if(k<cnt[0][0])
            continue;
        k-=cnt[0][0];
        if(k<cnt[0][1]) {
            ans0=do0;
            all++;
            continue;
        }
        k-=cnt[0][1];
        if(k<cnt[1][0]) {
            ans1=do1;
            all++;
            continue;
        }
        k-=cnt[1][0];
        ans1=do1, ans0=do0;
        all+=2;
    }
    cout << all << " ";
    for(int i=0; i<N/2; i++) {
        if((ans0&(1<<i))!=0)
            cout << 2*i+1 << " ";
        if((ans1&(1<<i))!=0)
            cout << 2*i+2 << " ";
    }
    cout << endl;
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);

    pre();
    int t;
    cin >> t;
    while(t--) {
        int k;
        cin >> k;
        slv(k);
    }

    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...