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"
#include<algorithm>
using namespace std;
typedef long long ll;
struct bignum{
bignum(){}
void init(){for(int i=0;i<73;i++)p[i]=0;}
int p[73];
}nCr[580][580],I;
int E[300];
bignum Plus(bignum A,bignum B)
{
bignum ret;
ret.init();
for(int i=0;i<72;i++){
ret.p[i] += A.p[i] + B.p[i];
ret.p[i+1] += ret.p[i]>>8;
ret.p[i] &= 0xff;
}
return ret;
}
bool comp(bignum A,bignum B)
{
int i;
for(i=72;i>=0;i--)if(A.p[i]!=B.p[i])return A.p[i]<B.p[i];
return 0;
}
inline bignum nHr(int n,int r){return nCr[n+r-1][min(n-1,r)];}
void encode(int N, int M[])
{
int i,j;
if(!nCr[1][1].p[0]){
for(i=0;i<580;i++){
nCr[i][0].p[0]=1;
nCr[i][i].p[0]=1;
for(j=1;j<i;j++)nCr[i][j] = Plus(nCr[i-1][j],nCr[i-1][j-1]);
}
}
for(i=N-1;i>=0;i--)I.p[i] = M[i];
int R = 5*N;
bignum tmp;
tmp.init();
for(i=0;i<256;i++){
for(j=0;j<=R;j++){
bignum tmp2 = Plus(tmp,nHr(256-i,R-j));
if(comp(I,tmp2))break;
tmp = tmp2;
}
E[i]=j;
R-=j;
}
for(i=0;i<256;i++){
for(j=0;j<E[i];j++)send(i);
}
}
#include "decoder.h"
#include "decoderlib.h"
#include<algorithm>
using namespace std;
struct dbignum{
dbignum(){}
void init(){for(int i=0;i<73;i++)p[i]=0;}
int p[73];
}dnCr[580][580],dI;
int D[300];
dbignum dPlus(dbignum A,dbignum B)
{
dbignum ret;
ret.init();
for(int i=0;i<72;i++){
ret.p[i] += A.p[i] + B.p[i];
ret.p[i+1] += ret.p[i]>>8;
ret.p[i] &= 0xff;
}
return ret;
}
bool dcomp(dbignum A,dbignum B)
{
int i;
for(i=72;i>=0;i--)if(A.p[i]!=B.p[i])return A.p[i]<B.p[i];
return 0;
}
inline dbignum dnHr(int n,int r){return dnCr[n+r-1][min(n-1,r)];}
void decode(int N, int L, int X[])
{
int i,j;
if(!dnCr[1][1].p[0]){
for(i=0;i<580;i++){
dnCr[i][0].p[0]=1;
dnCr[i][i].p[0]=1;
for(j=1;j<i;j++)dnCr[i][j] = dPlus(dnCr[i-1][j],dnCr[i-1][j-1]);
}
}
for(i=0;i<256;i++)D[i]=0;
for(i=0;i<L;i++)D[X[i]]++;
int R = 5*N;
dbignum tmp;
tmp.init();
for(i=0;i<256;i++){
for(j=0;j<D[i];j++){
tmp = dPlus(tmp,dnHr(256-i,R-j));
}
R-=j;
}
for(i=0;i<N;i++)output(tmp.p[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... |