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 <bits/stdc++.h>
using namespace std;
#define Huge amongus
#define transmit transmitamongus
#define maxint maxintamongus
#define nbit nbitamongus
#define ncr ncramongus
int transmit = 280, maxint = 255, nbit = 8;
#define nmax (transmit + maxint)
class Huge {
vector<int> num;
public:
void print() {
for(int i = num.size() - 1; i >= 0; i--)
cerr << num[i];
cerr << '\n';
}
int get(int poz) const { if(poz >= num.size()) return 0; return num[poz]; }
void shrink_to_fit() {
while(!num.empty() && num.back() == 0)
num.pop_back();
return;
}
bool operator < (const Huge& other) const {
if(num.size() < other.num.size()) return 1;
if(num.size() > other.num.size()) return 0;
for(int i = num.size() - 1; i >= 0; i--)
if(num[i] < other.num[i])
return 1;
else if(num[i] > other.num[i])
return 0;
return 0;
}
bool operator > (const Huge& other) const { return (other < *this); }
bool operator <= (const Huge& other) const { return !(*this > other); }
bool operator >= (const Huge& other) const { return !(*this < other); }
Huge() {
num.clear();
}
Huge(int x) {
assert(x < 10);
num.clear();
if(x != 0)
num.push_back(x);
}
int operator % (const int& x) { assert(x == 2); return num[0] % 2; }
void operator *= (const int& x) {
int t = 0, len = num.size();
for(int i = 0; i < len; i++)
num[i] = (t = (t / 10 + num[i] * x)) % 10;
t /= 10;
while(t) {
num.push_back(t % 10);
t /= 10;
}
}
void operator /=(const int& x) {
int t = 0;
for(int i = num.size() - 1; i >= 0; i--) {
num[i] = (t = ((t % x) * 10 + num[i])) / x;
}
shrink_to_fit();
}
void operator <<=(const int& x) {
if(num.empty())
return;
for(int i = 0; i < x; i++)
*this *= 2;
return;
}
void operator >>=(const int& x) {
for(int i = 0; i < x && !num.empty(); i++)
*this /= 2;
return;
}
Huge operator +(const Huge& other) const {
Huge rez;
int t = 0, len = max(other.num.size(), num.size());
for(int i = 0; i < len; i++) {
rez.num.push_back((t = t / 10 + other.get(i) + get(i)) % 10);
}
t /= 10;
while(t) {
rez.num.push_back(t % 10);
t /= 10;
}
return rez;
}
Huge operator -(const Huge& other) const {
if(*this < other)
assert(false);
Huge rez;
int t = 0;
for(int i = 0; i < num.size(); i++) {
rez.num.push_back(((t = (num[i] - other.get(i) - t)) + 10) % 10);
if(t < 0) t = 1;
else t = 0;
}
rez.shrink_to_fit();
return rez;
}
void operator -=(const Huge& other) { *this = *this - other; }
void operator +=(const Huge& other) { *this = *this + other; }
void operator +=(int x) {*this = *this + Huge(x);}
void operator -=(int x) {*this = *this + Huge(x);}
};
void encode(int N, int M[]) {
transmit = N * 5;
vector<vector<Huge>> ncr(nmax + 1, vector<Huge>(nmax + 1));
ncr[0][0] = 1;
for(int i = 1; i <= nmax; i++) {
ncr[i][0] = 1;
ncr[i][i] = 1;
for(int j = 1; j < i; j++)
ncr[i][j] = ncr[i - 1][j] + ncr[i - 1][j - 1];
}
Huge mine;
for(int i = 0; i < N; i++) {
for(int j = 0; j < nbit; j++)
mine *= 2,
mine += ((M[i] & (1 << j)) > 0);
//mine.print();
}
//cerr << "We sent: ";
//mine.print();
int sent = transmit;
for(int i = nmax; i >= 1; i--) {
if(mine >= ncr[i - 1][sent]) {
mine -= ncr[i - 1][sent];
send(i - sent);
//cerr << "Sent " << i - sent << '\n';
sent--;
}
}
//cerr << sent << '\n';
return;
}
#undef nmax
#include "decoder.h"
#include "decoderlib.h"
#include <bits/stdc++.h>
using namespace std;
int transmit, maxint = 255, nbit = 8;
#define nmax (transmit + maxint)
class Huge {
vector<int> num;
public:
void print() {
for(int i = num.size() - 1; i >= 0; i--)
cerr << num[i];
cerr << '\n';
}
int get(int poz) const { if(poz >= num.size()) return 0; return num[poz]; }
void shrink_to_fit() {
while(!num.empty() && num.back() == 0)
num.pop_back();
return;
}
bool operator < (const Huge& other) const {
if(num.size() < other.num.size()) return 1;
if(num.size() > other.num.size()) return 0;
for(int i = num.size() - 1; i >= 0; i--)
if(num[i] < other.num[i])
return 1;
else if(num[i] > other.num[i])
return 0;
return 0;
}
bool operator > (const Huge& other) const { return (other < *this); }
bool operator <= (const Huge& other) const { return !(*this > other); }
bool operator >= (const Huge& other) const { return !(*this < other); }
Huge() {
num.clear();
}
Huge(int x) {
assert(x < 10);
num.clear();
if(x != 0)
num.push_back(x);
}
int operator % (const int& x) { assert(x == 2); return num[0] % 2; }
void operator *= (const int& x) {
int t = 0, len = num.size();
for(int i = 0; i < len; i++)
num[i] = (t = (t / 10 + num[i] * x)) % 10;
t /= 10;
while(t) {
num.push_back(t % 10);
t /= 10;
}
}
void operator /=(const int& x) {
int t = 0;
for(int i = num.size() - 1; i >= 0; i--) {
num[i] = (t = ((t % x) * 10 + num[i])) / x;
}
shrink_to_fit();
}
void operator <<=(const int& x) {
if(num.empty())
return;
for(int i = 0; i < x; i++)
*this *= 2;
return;
}
void operator >>=(const int& x) {
for(int i = 0; i < x && !num.empty(); i++)
*this /= 2;
return;
}
Huge operator +(const Huge& other) const {
Huge rez;
int t = 0, len = max(other.num.size(), num.size());
for(int i = 0; i < len; i++) {
rez.num.push_back((t = t / 10 + other.get(i) + get(i)) % 10);
}
t /= 10;
while(t) {
rez.num.push_back(t % 10);
t /= 10;
}
return rez;
}
Huge operator -(const Huge& other) const {
if(*this < other)
assert(false);
Huge rez;
int t = 0;
for(int i = 0; i < num.size(); i++) {
rez.num.push_back(((t = (num[i] - other.get(i) - t)) + 10) % 10);
if(t < 0) t = 1;
else t = 0;
}
rez.shrink_to_fit();
return rez;
}
void operator -=(const Huge& other) { *this = *this - other; }
void operator +=(const Huge& other) { *this = *this + other; }
void operator +=(int x) {*this = *this + Huge(x);}
void operator -=(int x) {*this = *this + Huge(x);}
};
void decode(int N, int L, int X[]) {
transmit = N * 5;
vector<vector<Huge>> ncr(nmax + 1, vector<Huge>(nmax + 1));
ncr[0][0] = 1;
for(int i = 1; i <= nmax; i++) {
ncr[i][0] = 1;
ncr[i][i] = 1;
for(int j = 1; j < i; j++)
ncr[i][j] = ncr[i - 1][j] + ncr[i - 1][j - 1];
}
int b;
vector<int> got;
for(int i=0; i<L; i++) {
got.push_back(X[i]);
}
sort(got.begin(), got.end());
int nth = 0;
Huge rez;
for(auto i : got) {
nth++;
i += nth;
rez += ncr[i - 1][nth];
}
//cerr << "We received: ";
//rez.print();
vector<int> found;
for(int i = 0; i < N; i++) {
found.push_back(0);
for(int j = 0; j < nbit; j++) {
//cerr << "one ";
found.back() = found.back() * 2 + (rez % 2),
rez /= 2;
}
//rez.print();
}
while(!found.empty())
//cerr << found.back() << ' ',
output(found.back()),
found.pop_back();
//cerr << '\n';
return;
}
#undef nmax
Compilation message (stderr)
encoder.cpp: In member function 'int amongus::get(int) const':
encoder.cpp:24:37: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
24 | int get(int poz) const { if(poz >= num.size()) return 0; return num[poz]; }
| ~~~~^~~~~~~~~~~~~
encoder.cpp: In member function 'amongus amongus::operator-(const amongus&) const':
encoder.cpp:100:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
100 | for(int i = 0; i < num.size(); i++) {
| ~~^~~~~~~~~~~~
decoder.cpp: In member function 'int Huge::get(int) const':
decoder.cpp:17:37: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
17 | int get(int poz) const { if(poz >= num.size()) return 0; return num[poz]; }
| ~~~~^~~~~~~~~~~~~
decoder.cpp: In member function 'Huge Huge::operator-(const Huge&) const':
decoder.cpp:93:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
93 | for(int i = 0; i < num.size(); i++) {
| ~~^~~~~~~~~~~~
decoder.cpp: In function 'void decode(int, int, int*)':
decoder.cpp:118:7: warning: unused variable 'b' [-Wunused-variable]
118 | int b;
| ^
# | 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... |