This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#ifndef BIGNUM_H_
#define BIGNUM_H_
#include <bits/stdc++.h>
using namespace std;
struct Bignum{
vector<int> value;
void norm(){
while (value.size() && value.back()==0) value.pop_back();
if (value.empty()) value.push_back(0);
}
Bignum(int x=0){
while (x){
value.push_back(x&255);
x>>=8;
}
}
Bignum operator+(Bignum b){
Bignum a=*this, c;
while (a.value.size()<b.value.size()) a.value.push_back(0);
while (b.value.size()<a.value.size()) b.value.push_back(0);
c.value.resize(a.value.size());
int carry=0;
for (int i=0; i<(int)c.value.size(); ++i){
int sum=a.value[i]+b.value[i]+carry;
c.value[i]=sum&255;
carry=sum>>8;
}
if (carry) c.value.push_back(carry);
return c;
}
bool operator<(Bignum b){
Bignum a=*this;
if (a.value.size()<b.value.size()) return 1;
if (a.value.size()>b.value.size()) return 0;
for (int i=(int)a.value.size()-1; i>=0; --i){
if (a.value[i]!=b.value[i]){
return a.value[i]<b.value[i];
}
}
return 0;
}
Bignum operator-(Bignum b){
Bignum a=*this, c;
assert(!(a<b));
while (b.value.size()<a.value.size()) b.value.push_back(0);
c.value.resize(a.value.size());
int carry=0;
for (int i=0; i<(int)a.value.size(); ++i){
int diff=a.value[i]-b.value[i]-carry;
if (diff<0){
diff+=256;
carry=1;
}else carry=0;
c.value[i]=diff;
}
c.norm();
return c;
}
};
#endif
#include "encoder.h"
#include "encoderlib.h"
#include "decoder.h"
#include "decoderlib.h"
#ifdef sus
#include "bignum.h"
#endif
#include <bits/stdc++.h>
using namespace std;
Bignum f[321][257], pf[321][257];
void precalc(int mxlen){
for (int val=0; val<256; ++val) f[0][val]=1, pf[0][val]=256-val;
for (int len=1; len<=mxlen; ++len){
for (int val=0; val<256; ++val){
f[len][val]=pf[len-1][val];
}
pf[len][255]=f[len][255];
for (int val=254; val>=0; --val) pf[len][val]=f[len][val]+pf[len][val+1];
}
}
void encode(int n, int a[])
{
int mxlen=n*5;
precalc(mxlen);
Bignum cur;
for (int i=0; i<n; ++i) cur.value.push_back(a[i]);
cur.norm();
int lst=0;
for (int i=1; i<=mxlen; ++i){
for (int val=lst; val<256; ++val){
if (cur<f[mxlen-i][val]){
send(val);
cerr << val << ' ';
lst=val;
break;
}
cur=cur-f[mxlen-i][val];
}
}
cerr << '\n';
}
#ifndef BIGNUM_H_
#define BIGNUM_H_
#include <bits/stdc++.h>
using namespace std;
struct Bignum{
vector<int> value;
void norm(){
while (value.size() && value.back()==0) value.pop_back();
if (value.empty()) value.push_back(0);
}
Bignum(int x=0){
while (x){
value.push_back(x&255);
x>>=8;
}
}
Bignum operator+(Bignum b){
Bignum a=*this, c;
while (a.value.size()<b.value.size()) a.value.push_back(0);
while (b.value.size()<a.value.size()) b.value.push_back(0);
c.value.resize(a.value.size());
int carry=0;
for (int i=0; i<(int)c.value.size(); ++i){
int sum=a.value[i]+b.value[i]+carry;
c.value[i]=sum&255;
carry=sum>>8;
}
if (carry) c.value.push_back(carry);
return c;
}
bool operator<(Bignum b){
Bignum a=*this;
if (a.value.size()<b.value.size()) return 1;
if (a.value.size()>b.value.size()) return 0;
for (int i=(int)a.value.size()-1; i>=0; --i){
if (a.value[i]!=b.value[i]){
return a.value[i]<b.value[i];
}
}
return 0;
}
Bignum operator-(Bignum b){
Bignum a=*this, c;
assert(!(a<b));
while (b.value.size()<a.value.size()) b.value.push_back(0);
c.value.resize(a.value.size());
int carry=0;
for (int i=0; i<(int)a.value.size(); ++i){
int diff=a.value[i]-b.value[i]-carry;
if (diff<0){
diff+=256;
carry=1;
}else carry=0;
c.value[i]=diff;
}
c.norm();
return c;
}
};
#endif
#include "decoder.h"
#include "decoderlib.h"
#ifdef sus
#include "bignum.h"
#endif
#include <bits/stdc++.h>
using namespace std;
Bignum f[321][257], pf[321][257];
void precalc(int mxlen){
for (int val=0; val<256; ++val) f[0][val]=1, pf[0][val]=256-val;
for (int len=1; len<=mxlen; ++len){
for (int val=0; val<256; ++val){
f[len][val]=pf[len-1][val];
}
pf[len][255]=f[len][255];
for (int val=254; val>=0; --val) pf[len][val]=f[len][val]+pf[len][val+1];
}
}
void decode(int n, int m, int a[])
{
precalc(m);
sort(a, a+m);
Bignum cur;
for (int i=0; i<m; ++i){
for (int val=i?a[i-1]:0; val<a[i]; ++val) cur=cur+f[m-i-1][val];
}
cur.value.resize(n);
for (int i:cur.value) output(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... |