This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "encoder.h"
#include "encoderlib.h"
static int A[21];
static long long C[41][41];
long long static H(int X, int Y) {
return C[X+Y-1][X];
}
void static MakeSequence(long long Num, int K) {
int i, j;
long long Temp;
for(i=1 ; i<=K ; i++)
for(j=A[i-1] ; j<=16 ; j++) {
Temp=H(K-i,17-j);
if(Num<=Temp || !Temp) {
A[i]=j;
break;
}
else
Num-=Temp;
}
}
void encode(int N, int M[]) {
int i, j;
long long Num;
for(i=1 ; i<=40 ; i++) {
C[i][0]=C[i][i]=1;
for(j=1 ; j<=i-1 ; j++)
C[i][j]=C[i-1][j-1]+C[i-1][j];
}
for(i=3 ; i<N ; i+=4) {
Num=(long long)M[i-3]+(long long)256*M[i-2]+(long long)256*256*M[i-1]+(long long)256*256*256*M[i];
MakeSequence(Num,20);
for(j=1 ; j<=20 ; j++)
if(A[j]!=16)
send((i/4)+(A[j]<<4));
}
if(N%4==1) {
Num=(long long)M[N-1];
MakeSequence(Num,5);
for(j=1 ; j<=5 ; j++)
if(A[j]!=16)
send(((N-1)/4)+(A[j]<<4));
}
else if(N%4==2) {
Num=(long long)M[N-2]+(long long)256*M[N-1];
MakeSequence(Num,10);
for(j=1 ; j<=10 ; j++)
if(A[j]!=16)
send(((N-1)/4)+(A[j]<<4));
}
else if(N%4==3) {
Num=(long long)M[N-3]+(long long)256*M[N-2]+(long long)256*256*M[N-1];
MakeSequence(Num,15);
for(j=1 ; j<=15 ; j++)
if(A[j]!=16)
send(((N-1)/4)+(A[j]<<4));
}
}
#include "decoder.h"
#include "decoderlib.h"
#include <algorithm>
using namespace std;
static int M, Group[16][21], Cnt[16], Ans[65], Len;
static long long C[41][41];
long long static H(int X, int Y) {
return C[X+Y-1][X];
}
long long static RemoveSequence(int X, int Y) {
int i, j;
long long Num=0;
for(i=1 ; i<=Y ; i++)
for(j=Group[X][i-1] ; j<Group[X][i] ; j++)
Num+=H(Y-i,17-j);
if(Num)
Num++;
return Num;
}
void decode(int N, int L, int X[]) {
int i, j, Temp1, Temp2;
long long Num;
for(i=0 ; i<=15 ; i++)
Cnt[i]=0;
Len=0;
for(i=1 ; i<=40 ; i++) {
C[i][0]=C[i][i]=1;
for(j=1 ; j<=i-1 ; j++)
C[i][j]=C[i-1][j-1]+C[i-1][j];
}
M=N/4;
for(i=0 ; i<L ; i++) {
Temp2=(X[i]>>4);
Temp1=X[i]-(Temp2<<4);
Group[Temp1][++Cnt[Temp1]]=Temp2;
}
for(i=0 ; i<M ; i++) {
for(j=Cnt[i]+1 ; j<=20 ; j++)
Group[i][j]=16;
sort(Group[i]+1,Group[i]+21);
Num=RemoveSequence(i,20);
for(j=1 ; j<=4 ; j++) {
Ans[++Len]=Num%256;
Num/=256;
}
}
if(N%4==1) {
for(j=Cnt[M]+1 ; j<=5 ; j++)
Group[M][j]=16;
sort(Group[M]+1,Group[M]+6);
Num=RemoveSequence(M,5);
Ans[++Len]=Num%256;
Num/=256;
}
else if(N%4==2) {
for(j=Cnt[M]+1 ; j<=10 ; j++)
Group[M][j]=16;
sort(Group[M]+1,Group[M]+11);
Num=RemoveSequence(M,10);
for(j=1 ; j<=2 ; j++) {
Ans[++Len]=Num%256;
Num/=256;
}
}
else if(N%4==3) {
for(j=Cnt[M]+1 ; j<=15 ; j++)
Group[M][j]=16;
sort(Group[M]+1,Group[M]+16);
Num=RemoveSequence(M,15);
for(j=1 ; j<=3 ; j++) {
Ans[++Len]=Num%256;
Num/=256;
}
}
for(i=1 ; i<=N ; i++)
output(Ans[i]);
}
# | 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... |