#include "encoder.h"
#include "encoderlib.h"
#include<bits/stdc++.h>
using namespace std;
#define in insert
#define all(x) x.begin(),x.end()
#define pb push_back
#define eb emplace_back
#define ff first
#define ss second
//#define int long long
typedef long long ll;
typedef vector<int> vi;
typedef set<int> si;
typedef multiset<int> msi;
typedef pair<int, int> pii;
typedef vector<pii> vpii;
const int B = 10000, A = 40;
struct bigNum {
array<int, A> dig;
bigNum(int x = 0) {
for(int i = 0; i < A; i++) {
dig[i] = x % B;
x /= B;
}
}
bigNum& operator+=(const bigNum &b) {
int carry = 0;
for(int i = 0; i < A; i++) {
dig[i] += b.dig[i] + carry;
carry = dig[i] / B;
dig[i] %= B;
}
return *this;
};
bigNum& operator-=(const bigNum &b) {
for(int i = 0; i < A; i++) {
dig[i] -= b.dig[i];
while(dig[i] < 0) {
assert(i + 1 < A);
dig[i] += B;
dig[i + 1]--;
}
}
return *this;
}
bigNum& operator*=(const int &b) {
int carry = 0;
for(int i = 0; i < A; i++) {
dig[i] *= b;
dig[i] += carry;
carry = dig[i] / B;
dig[i] %= B;
}
return *this;
}
friend bigNum operator+(const bigNum &a, const bigNum &b) {
return bigNum(a) += b;
}
friend bigNum operator-(const bigNum &a, const bigNum &b) {
return bigNum(a) -= b;
}
friend bigNum operator*(const bigNum &a, const int &b) {
return bigNum(a) *= b;
}
int compare(const bigNum &a) {
for(int i = A - 1; i >= 0; i--) {
if(a.dig[i] > dig[i]) return -1;
else if(a.dig[i] < dig[i]) return 1;
}
return 0;
}
bool operator<(const bigNum &b) {
return this->compare(b) == -1;
}
bool operator>(const bigNum &b) {
return this->compare(b) == 1;
}
bool operator==(const bigNum &b) {
return this->compare(b) == 0;
}
bool operator!=(const bigNum &b) {
return this->compare(b) != 0;
}
bool operator<=(const bigNum &b) {
return this->compare(b) != 1;
}
bool operator>=(const bigNum &b) {
return this->compare(b) != -1;
}
friend ostream& operator<<(ostream& out, const bigNum &a) {
for(int i = 0; i < 10; i++) {
out << a.dig[i];
if(i + 1 < A) out << ", ";
}
out << ';';
}
};
void encode(int n, int a[]) {
bigNum val(0);
vector<bigNum> pw(1, 1);
for(int i = 1; i < n; i++) {
pw.pb(pw.back() * 256);
}
for(int i = 0; i < n; i++) {
val += pw[i] * a[i];
}
int len = n * 5;
vector<vector<bigNum>> dp(len + 1, vector<bigNum>(256, 0));
// dp[0] = vector<bigNum>(256, 1);
dp[0][0] = 1;
for(int i = 1; i <= len; i++) {
for(int j = 0; j < 256; j++) {
dp[i][j] = dp[i - 1][j];
if(j - 1 >= 0) dp[i][j] += dp[i][j - 1];
}
}
for(int i = len; i >= 1; i--) {
int ans = 0;
for(int j = 0; j < 256; j++) {
if(dp[i][j] > val) {
ans = j;
break;
}
val -= dp[i][j];
}
send(ans);
}
}
#include "decoder.h"
#include "decoderlib.h"
#include<bits/stdc++.h>
using namespace std;
#define in insert
#define all(x) x.begin(),x.end()
#define pb push_back
#define eb emplace_back
#define ff first
#define ss second
//#define int long long
typedef long long ll;
typedef vector<int> vi;
typedef set<int> si;
typedef multiset<int> msi;
typedef pair<int, int> pii;
typedef vector<pii> vpii;
const int B = 10000, A = 40;
struct bigNum {
array<int, A> dig;
bigNum(int x = 0) {
for(int i = 0; i < A; i++) {
dig[i] = x % B;
x /= B;
}
}
bigNum& operator+=(const bigNum &b) {
int carry = 0;
for(int i = 0; i < A; i++) {
dig[i] += b.dig[i] + carry;
carry = dig[i] / B;
dig[i] %= B;
}
return *this;
};
bigNum& operator-=(const bigNum &b) {
for(int i = 0; i < A; i++) {
dig[i] -= b.dig[i];
while(dig[i] < 0) {
dig[i] += B;
dig[i + 1]--;
}
}
return *this;
}
bigNum& operator*=(const int &b) {
int carry = 0;
for(int i = 0; i < A; i++) {
dig[i] = dig[i] * b + carry;
carry = dig[i] / B;
dig[i] %= B;
}
return *this;
}
friend bigNum operator+(const bigNum &a, const bigNum &b) {
return bigNum(a) += b;
}
friend bigNum operator-(const bigNum &a, const bigNum &b) {
return bigNum(a) -= b;
}
friend bigNum operator*(const bigNum &a, const int &b) {
return bigNum(a) *= b;
}
int compare(const bigNum &a) {
for(int i = A - 1; i >= 0; i--) {
if(a.dig[i] > dig[i]) return -1;
else if(a.dig[i] < dig[i]) return 1;
}
return 0;
}
bool operator<(const bigNum &b) {
return this->compare(b) == -1;
}
bool operator>(const bigNum &b) {
return this->compare(b) == 1;
}
bool operator==(const bigNum &b) {
return this->compare(b) == 0;
}
bool operator!=(const bigNum &b) {
return this->compare(b) != 0;
}
bool operator<=(const bigNum &b) {
return this->compare(b) != 1;
}
bool operator>=(const bigNum &b) {
return this->compare(b) != -1;
}
friend ostream& operator<<(ostream& out, const bigNum &a) {
for(int i = 0; i < 10; i++) {
out << a.dig[i];
if(i + 1 < A) out << ", ";
}
out << ';';
}
};
void decode(int n, int l, int x[]) {
sort(x, x + l);
int len = n * 5;
vector<vector<bigNum>> dp(len + 1, vector<bigNum>(256, 0));
// dp[0] = vector<bigNum>(256, 1);
dp[0][0] = 1;
for(int i = 1; i <= len; i++) {
for(int j = 0; j < 256; j++) {
dp[i][j] = dp[i - 1][j];
if(j - 1 >= 0) dp[i][j] += dp[i][j - 1];
}
}
vector<int> ret;
bigNum val(0);
for(int i = l - 1; i >= 0; i--) {
for(int j = 0; j < x[i]; j++) {
val += dp[i + 1][j];
}
}
vector<bigNum> pw(1, 1);
for(int i = 1; i < n; i++) {
pw.pb(pw.back() * 256);
}
for(int i = n - 1; i >= 0; i--) {
int ans = 0;
while(pw[i] <= val) {
ans++;
val -= pw[i];
}
ret.pb(ans);
}
reverse(all(ret));
for(int x : ret) {
output(x);
}
}
Compilation message
encoder.cpp: In function 'std::ostream& operator<<(std::ostream&, const bigNum&)':
encoder.cpp:101:2: warning: no return statement in function returning non-void [-Wreturn-type]
101 | }
| ^
decoder.cpp: In function 'std::ostream& operator<<(std::ostream&, const bigNum&)':
decoder.cpp:99:2: warning: no return statement in function returning non-void [-Wreturn-type]
99 | }
| ^
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
30 ms |
4224 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
151 ms |
4592 KB |
Output is correct |
2 |
Correct |
211 ms |
5740 KB |
Output is correct |
3 |
Correct |
285 ms |
7260 KB |
Output is correct |
4 |
Correct |
310 ms |
7772 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
149 ms |
4524 KB |
Output is correct |
2 |
Correct |
209 ms |
5856 KB |
Output is correct |
3 |
Correct |
286 ms |
7284 KB |
Output is correct |
4 |
Correct |
310 ms |
7816 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
156 ms |
4540 KB |
Output is correct |
2 |
Correct |
318 ms |
7664 KB |
Output is correct |
3 |
Correct |
398 ms |
9468 KB |
Output is correct |
4 |
Correct |
632 ms |
13444 KB |
Output is correct |
5 |
Correct |
651 ms |
13740 KB |
Output is correct |
6 |
Correct |
681 ms |
14152 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
308 ms |
7692 KB |
Output is correct - P = 5.000000 |
2 |
Correct |
668 ms |
14200 KB |
Output is correct - P = 5.000000 |
3 |
Correct |
718 ms |
14664 KB |
Output is correct - P = 5.000000 |
4 |
Correct |
1194 ms |
21512 KB |
Output is correct - P = 5.000000 |
5 |
Correct |
1505 ms |
25540 KB |
Output is correct - P = 5.000000 |
6 |
Correct |
1639 ms |
26808 KB |
Output is correct - P = 5.000000 |
7 |
Correct |
1694 ms |
27164 KB |
Output is correct - P = 5.000000 |