# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
515622 | kshitij_sodani | Present (RMI21_present) | C++14 | 4064 ms | 55668 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
//#pragma GCC optimize("Ofast,unroll-loops")
#include <bits/stdc++.h>
using namespace std;
typedef long long llo;
#define mp make_pair
#define pb push_back
#define a first
#define b second
#define endl '\n'
int pre[61][61];
llo dp[1<<22][23];;
int cal[1<<22];
int cal2[1<<22];
int comp[1<<22];
int vis[1<<22];
int vis2[1<<22];
int vis3[44];
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
for(int i=1;i<=60;i++){
for(int j=1;j<=60;j++){
pre[i][j]=__gcd(i,j);
}
}
int zz=0;
int zz2=0;
int bb=18;
int cc=19;
//for(int i=1;i<=bb;i++){
int oo=0;
int pp=0;
for(int j=0;j<(1<<(bb));j++){
vector<int> tt;
int cur=0;
int ec=-1;
for(int i=0;i<bb;i++){
if((1<<i)&j){
ec=(1<<i);
tt.pb(i*2+2);
}
}
if(tt.size()){
cur=cal2[j-ec];
}
for(int k=0;k+1<tt.size();k++){
cur|=(1<<((pre[tt[k]][tt.back()]/2)-1));
}
cal2[j]=cur;
if((cur|j)==j){
// dp[(1<<bb)-j-1][0]=1;
vis[j]=1;
//oo++;
}
// pp++;
}
// cout<<11<<endl;
int val5=0;
/*for(int j=0;j<(1<<bb);j++){
for(int i=0;i<bb;i++){
}
}*/
for(int j=0;j<(1<<cc);j++){
vector<int> tt;
int cur=0;
int ec=0;
for(int i=0;i<cc;i++){
if((1<<i)&j){
ec=(1<<i);
tt.pb(i*2+1);
}
}
if(tt.size()){
cur=cal[j-ec];
}
for(int k=0;k+1<tt.size();k++){
cur|=(1<<(pre[tt[k]][tt.back()]/2));
}
if((cur|j)==j){
int su=0;
for(int i=0;i<bb;i++){
int st=1;
for(auto k:tt){
if((1<<(pre[k][2*i+2]/2))&j){
}
else{
st=0;
break;
}
}
if(st==1){
su+=(1<<i);
}
}
vis2[j]=1;
comp[j]=su;
//cout<<j<<":"<<su<<endl;
}
cal[j]=cur;
/*if(j>0){
nn[j]+=nn[j-1];
}*/
}
int t;
cin>>t;
while(t--){
llo n;
cin>>n;
if(n==0){
cout<<0<<endl;
continue;
}
n++;
for(int i=1;i<=bb+cc;i++){
vis3[i]=0;
}
for(int ii=bb+cc;ii>=1;ii--){
vis3[ii]=-1;
int ac=0;
int bc=0;
for(int j=bb+cc-1;j>=ii;j-=2){
if(vis3[j]==-1){
ac+=(1<<((j-1)/2));
}
else{
bc+=(1<<((j-1)/2));
}
}
int ac2=0;
int bc2=0;
for(int j=bb+cc;j>=ii;j-=2){
if(vis3[j]==-1){
ac2+=(1<<(j/2));
}
else{
bc2+=(1<<(j/2));
}
}
llo zz=0;
for(int j=0;j<(1<<bb);j++){
dp[j][0]=0;
if(vis[j]){
if((j&ac)==0){
if((j|bc)==j){
dp[j][0]=1;
}
}
}
for(int i=1;i<=bb;i++){
if((1<<(i-1))&j){
dp[j][i]=dp[j][i-1]+dp[j-(1<<(i-1))][i-1];
}
else{
dp[j][i]=dp[j][i-1];
}
}
}
for(int j=0;j<(1<<cc);j++){
if(vis2[j]==1){
if((j&ac2)>0){
continue;
}
if((j|bc2)==j){
zz+=(llo)dp[comp[j]][bb];
}
}
}
/*if(ii==1){
cout<<zz<<"::"<<endl;
}*/
if(zz<n){
n-=zz;
vis3[ii]=1;
continue;
}
}
assert(n==1);
vector<int> ans;
for(int i=1;i<=bb+cc;i++){
if(vis3[i]==1){
ans.pb(i);
}
}
cout<<ans.size()<<" ";
for(auto j:ans){
cout<<j<<" ";
}
cout<<endl;
}
/*cout<<zz<<endl;
cout<<zz2<<endl;
int su=0;
int cot=1500000000;
cot=1e6;
for(int i=1;i<=50;i++){
int cur=max(i-(i/3)-1,(int)0);
su+=(1LL<<cur);
if(su>=cot){
cout<<i<<endl;
break;
}
}
*/
return 0;
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |