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<bits/stdc++.h>
#include "encoder.h"
#include "encoderlib.h"
using namespace std;
static const int BASE_NB=256,TAILLE_MAX=5*64;
static int tailleMess,nbVal;
static vector<int> memo[TAILLE_MAX][BASE_NB];
static vector<int> somme(vector<int> a,vector<int> b) {
int retenue=0;
vector<int> ans;
for (int i=0;i<(int)max(a.size(),b.size());i++) {
if (i<(int)a.size()) {
retenue+=a[i];
}
if (i<(int)b.size()) {
retenue+=b[i];
}
ans.push_back(retenue%BASE_NB);
retenue/=BASE_NB;
}
if (retenue!=0) {
ans.push_back(retenue);
}
return ans;
}
static vector<int> prod1(vector<int> a,int n,int decal) {
if (n==0) {
return {};
}
vector<int> ans;
for (int i=0;i<decal;i++) {
ans.push_back(0);
}
int retenue=0;
for (int i:a) {
retenue+=i*n;
ans.push_back(retenue%BASE_NB);
retenue/=BASE_NB;
}
if (retenue!=0) {
ans.push_back(retenue);
}
return ans;
}
static vector<int> produit(vector<int> a,vector<int> b) {
if (a.empty() or b.empty()) {
return {};
}
vector<int> ans;
for (int i=0;i<(int)b.size();i++) {
ans=somme(ans,prod1(a,b[i],i));
}
return ans;
}
static vector<int> puiss(vector<int> a,int expo) {
if (expo==0) {
return {1};
}
if (expo==1) {
return a;
}
vector<int> ans=puiss(a,expo/2);
ans=produit(ans,ans);
if (expo%2==1) {
ans=produit(ans,a);
}
return ans;
}
static int ordre(vector<int> a,vector<int> b) {
if (a.size()>b.size()) {
return 1;
}
if (a.size()<b.size()) {
return -1;
}
for (int i=(int)a.size()-1;i>=0;i--) {
if (a[i]>b[i]) {
return 1;
}
if (a[i]<b[i]) {
return -1;
}
}
return 0;
}
static vector<int> dyna(int pos,int dern) {
if (pos==tailleMess) {
return {1};
}
if (!memo[pos][dern].empty()) {
return memo[pos][dern];
}
for (int i=dern;i<BASE_NB;i++) {
memo[pos][dern]=somme(memo[pos][dern],dyna(pos+1,i));
}
return memo[pos][dern];
}
void encode(int N, int M[]) {
nbVal=N;
tailleMess=5*nbVal;
vector<int> envoi,numContract,nbAvant;
for (int i=0;i<nbVal;i++) {
numContract.push_back(M[i]);
}
/*for (int i:numContract) {
cout<<i<<" ";
}
cout<<endl;*/
while (!numContract.empty() and numContract.back()==0) {
numContract.pop_back();
}
/*for (int i:numContract) {
cout<<i<<" ";
}
cout<<endl;*/
int dern=0;
for (int i=0;i<tailleMess;i++) {
while (ordre(somme(nbAvant,dyna(i+1,dern)),numContract)<=0) {
nbAvant=somme(nbAvant,dyna(i+1,dern));
dern++;
}
envoi.push_back(dern);
}
//cout<<ordre(nbAvant,numContract)<<endl;
for (int i:envoi) {
send(i);
}
}
#include<bits/stdc++.h>
#include "decoder.h"
#include "decoderlib.h"
using namespace std;
static const int BASE_NB=256,TAILLE_MAX=5*64;
static int tailleMess,nbVal;
static vector<int> memo[TAILLE_MAX][BASE_NB];
static vector<int> somme(vector<int> a,vector<int> b) {
int retenue=0;
vector<int> ans;
for (int i=0;i<(int)max(a.size(),b.size());i++) {
if (i<(int)a.size()) {
retenue+=a[i];
}
if (i<(int)b.size()) {
retenue+=b[i];
}
ans.push_back(retenue%BASE_NB);
retenue/=BASE_NB;
}
if (retenue!=0) {
ans.push_back(retenue);
}
return ans;
}
static vector<int> prod1(vector<int> a,int n,int decal) {
if (n==0) {
return {};
}
vector<int> ans;
for (int i=0;i<decal;i++) {
ans.push_back(0);
}
int retenue=0;
for (int i:a) {
retenue+=i*n;
ans.push_back(retenue%BASE_NB);
retenue/=BASE_NB;
}
if (retenue!=0) {
ans.push_back(retenue);
}
return ans;
}
static vector<int> produit(vector<int> a,vector<int> b) {
if (a.empty() or b.empty()) {
return {};
}
vector<int> ans;
for (int i=0;i<(int)b.size();i++) {
ans=somme(ans,prod1(a,b[i],i));
}
return ans;
}
static vector<int> puiss(vector<int> a,int expo) {
if (expo==0) {
return {1};
}
if (expo==1) {
return a;
}
vector<int> ans=puiss(a,expo/2);
ans=produit(ans,ans);
if (expo%2==1) {
ans=produit(ans,a);
}
return ans;
}
static int ordre(vector<int> a,vector<int> b) {
if (a.size()>b.size()) {
return 1;
}
if (a.size()<b.size()) {
return -1;
}
for (int i=(int)a.size()-1;i>=0;i--) {
if (a[i]>b[i]) {
return 1;
}
if (a[i]<b[i]) {
return -1;
}
}
return 0;
}
static vector<int> dyna(int pos,int dern) {
if (pos==tailleMess) {
return {1};
}
if (!memo[pos][dern].empty()) {
return memo[pos][dern];
}
for (int i=dern;i<BASE_NB;i++) {
memo[pos][dern]=somme(memo[pos][dern],dyna(pos+1,i));
}
return memo[pos][dern];
}
void decode(int N, int L, int X[]) {
nbVal=N;
tailleMess=L;
vector<int> recu;
for (int i=0;i<tailleMess;i++) {
recu.push_back(X[i]);
}
sort(recu.begin(),recu.end());
/*for (int i:recu) {
cout<<i<<" ";
}
cout<<endl;*/
vector<int> ans;
int dern=0;
for (int i=0;i<tailleMess;i++) {
while (dern<recu[i]) {
ans=somme(ans,dyna(i+1,dern));
dern++;
}
}
while ((int)ans.size()<nbVal) {
ans.push_back(0);
}
for (int i:ans) {
output(i);
}
}
Compilation message (stderr)
decoder.cpp:75:12: warning: 'int ordre(std::vector<int>, std::vector<int>)' defined but not used [-Wunused-function]
75 | static int ordre(vector<int> a,vector<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... |