Submission #1297979

#TimeUsernameProblemLanguageResultExecution timeMemory
1297979gesp3011v2Parrots (IOI11_parrots)C++20
100 / 100
12 ms844 KiB
#include "encoder.h"
#include "encoderlib.h"
#include "bits/stdc++.h"
using namespace std;
typedef long long ll;
short m[64];
ll sm[16];
ll C(int n, int r){
    ll ret=1,dw=1;
    for(ll i=2;i<=r;i++) dw*=i;
    for(ll i=n-r+1;i<=n;i++){
        ll g=gcd(i,dw);
        dw/=g;
        ret*=i/g;
    }
    return ret;
}
short multi[21],mid=0;
void enc(int len, short ele, ll rnk){
    if(len==0) return;
    while(rnk>=C(15-ele+len-1,15-ele)){
        rnk-=C(15-ele+len-1,15-ele);
        ele++;
    }
    multi[mid++]=ele;
    enc(len-1,ele,rnk);
}
void SD(int prf,ll msg){
    int len=0;
    while(msg>=C(16+len,16)) len++;
    if(len==0) return;
    msg-=C(15+len,16);
    mid=0;
    enc(len,0,msg);
    for(int i=0;i<len;i++) send(prf|multi[i]);
}
void encode(int N, int M[]){
    for(int i=0;i<N;i++) m[i]=M[i];
    for(int id=0;id*4<N;id++){
        int st=id*4;
        sm[id]=0;
        for(int j=st+3;j>=st;j--) sm[id]=(sm[id]<<8)|m[j];
        SD(id<<4,sm[id]);
    }
}
#include "decoder.h"
#include "decoderlib.h"
#include "bits/stdc++.h"
using namespace std;
typedef long long ll;

short M[64];
vector<int>ele[16];
ll SM[16];
ll c(int n, int r){
    ll ret=1,dw=1;
    for(ll i=2;i<=r;i++) dw*=i;
    for(ll i=n-r+1;i<=n;i++){
        ll g=gcd(i,dw);
        dw/=g;
        ret*=i/g;
    }
    return ret;
}

void DC(int id){
    SM[id]=0;
    if(ele[id].empty()) return;
    int len=ele[id].size();
    SM[id]=c(15+len,16);
    sort(ele[id].begin(),ele[id].end());
    int prf=0;
    for(int cur:ele[id]){
        len--;
        while(prf<cur){
            SM[id]+=c(15-prf+len,15-prf);
            prf++;
        }
    }
    return;
}
void decode(int N, int L, int X[]){
    for(int i=0;i<16;i++) ele[i].clear();
    for(int i=0;i<L;i++) ele[X[i]>>4].push_back(X[i]&15);
    for(int id=0;id<16;id++){
        DC(id);
        for(int i=(id<<2);i<=((id<<2)|3);i++){
            M[i]=(SM[id]&255);
            SM[id]>>=8;
        }
    }
    for(int i=0;i<N;i++)output(M[i]);
}
#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...