#include<iostream>
#include<vector>
#include<algorithm>
#include<utility>
#include "encoder.h"
#include "encoderlib.h"
using namespace std;
void encode(int n, int M[]){
#define int long long
int dp[27][23];
for(int i=0;i<=26;i++)for(int j=0;j<=20;j++)dp[i][j]=0;
dp[0][0]=1;
for(int i=1;i<=26;i++){
for(int j=0;j<=20;j++){
int sum=0;
for(int k=0;k<=j;k++)sum+=dp[i-1][k];
dp[i][j]=sum;
}
}
vector<int> v;
//encodes M to v
int ans=0;
for(int i=0;i<=(n/5);i++){
vector<int> temp;
if(i==n/5){
if(n%5==0)break;
if(n%5==1){
ans=M[i*5];
for(int k=0;k<5;k++)temp.push_back(0);
}
if(n%5==2){
ans=M[i*5]*256+M[i*5+1];
for(int k=0;k<10;k++)temp.push_back(0);
}
if(n%5==3){
ans=M[i*5]*256*256+M[i*5+1]*256+M[i*5+2];
for(int k=0;k<15;k++)temp.push_back(0);
}
if(n%5==4){
int triple=256*256*256;
ans=M[i*5]*triple+M[i*5+1]*256*256+M[i*5+2]*256+M[i*5+3];
for(int k=0;k<20;k++)temp.push_back(0);
}
}else{
int harn=256*256;
int triple=harn*256;
harn=harn*harn;
int a=M[i*5],b=M[i*5+1],c=M[i*5+2],d=M[i*5+3],e=M[i*5+4];
ans=a*harn+b*triple+c*256*256+d*256+e;
for(int k=0;k<25;k++)temp.push_back(0);
}
//cout << endl;
//cout << "ans"<< ans << endl;
//Encode ans->temp
int sum=0,remaining=19;
for(int j=temp.size()-1;j>0;j--){
for(int k=0;k<remaining;k++){
if(sum+dp[j+1][remaining-k]<=ans){
sum+=dp[j+1][remaining-k];
temp[j]=k+1;
}
else break;
}
remaining-=temp[j];
}
temp[0]=ans-sum;
for(auto x:temp)v.push_back(x);
}
//
//for(auto x:v)cout << x << " ";
//cout << endl;
int sum=0;
for(auto x:v){
sum+=x;
send((signed)(sum));
//cout << sum << " ";
}
#undef int
return;
}
#include<iostream>
#include<vector>
#include<algorithm>
#include<utility>
#include "decoder.h"
#include "decoderlib.h"
using namespace std;
void decode(int N, int l, int X[]){
#define int long long
int dp[27][23];
for(int i=0;i<=26;i++)for(int j=0;j<=20;j++)dp[i][j]=0;
dp[0][0]=1;
for(int i=1;i<=26;i++){
for(int j=0;j<=20;j++){
int sum=0;
for(int k=0;k<=j;k++)sum+=dp[i-1][k];
dp[i][j]=sum;
}
}
vector<int> v;
for(int i=0;i<l;i++){
v.push_back(X[i]);
}
sort(v.begin(),v.end());
int last=0,temp=0;
for(int i=0;i<v.size();i++){
int temp=v[i]-last;
last=v[i];
v[i]=temp;
}
for(int tempi=0;tempi<v.size()/25;tempi++){
int i=tempi*25;
vector<int> temp;
int tempsum=0;
for(int j=i;j<i+25;j++){
temp.push_back(v[j]);
tempsum+=v[j];
}
temp.insert(temp.begin(),19-tempsum);
int ans=0,remaining=19;
//decode temp into ans
for(int j=temp.size()-1;j>=2;j--){
for(int k=temp[j]-1;k>=0;k--){
ans+=dp[j][remaining-k];
}
remaining-=temp[j];
}
ans+=temp[1];
//
long long harn=256*256;
long long triple=256*256*256;
harn=harn*harn;
int a=ans/(harn);
ans%=(harn);
int b=ans/(triple);
ans%=(triple);
int c=ans/(256*256);
ans%=(256*256);
int d=ans/256;
ans%=256;
int e=ans;
output((signed)a);
output((signed)b);
output((signed)c);
output((signed)d);
output((signed)e);
}
if(v.size()%25==5){
int ans=0,tempsum=0;
vector<int> temp;
for(int j=((v.size()/25)*25);j<v.size();j++){
temp.push_back(v[j]);
tempsum+=v[j];
}
for(int i=0;i<20;i++)temp.push_back(0);
temp.insert(temp.begin(),19-tempsum);
//decode temp to ans
int remaining=19;
for(int j=temp.size()-1;j>=2;j--){
for(int k=temp[j]-1;k>=0;k--){
ans+=dp[j][remaining-k];
}
remaining-=temp[j];
}
ans+=temp[1];
//
output((signed)ans);
}
if(v.size()%25==10){
int ans=0,tempsum=0;
vector<int> temp;
for(int j=((v.size()/25)*25);j<v.size();j++){
temp.push_back(v[j]);
tempsum+=v[j];
}
for(int i=0;i<15;i++)temp.push_back(0);
temp.insert(temp.begin(),19-tempsum);
//decode temp to ans
int remaining=19;
for(int j=temp.size()-1;j>=2;j--){
for(int k=temp[j]-1;k>=0;k--){
ans+=dp[j][remaining-k];
}
remaining-=temp[j];
}
ans+=temp[1];
//
output((signed)ans/256);
output((signed)ans%256);
}
if(v.size()%25==15){
int ans=0,tempsum=0;
vector<int> temp;
for(int j=((v.size()/25)*25);j<v.size();j++){
temp.push_back(v[j]);
tempsum+=v[j];
}
for(int i=0;i<10;i++)temp.push_back(0);
temp.insert(temp.begin(),19-tempsum);
//decode temp to ans
int remaining=19;
for(int j=temp.size()-1;j>=2;j--){
for(int k=temp[j]-1;k>=0;k--){
ans+=dp[j][remaining-k];
}
remaining-=temp[j];
}
ans+=temp[1];
//
output((signed)ans/(256*256));
ans%=(256*256);
output((signed)ans/256);
ans%=256;
output((signed)ans);
}
if(v.size()%25==20){
int ans=0,tempsum=0;
vector<int> temp;
for(int j=((v.size()/25)*25);j<v.size();j++){
temp.push_back(v[j]);
tempsum+=v[j];
}
for(int i=0;i<5;i++)temp.push_back(0);
temp.insert(temp.begin(),19-tempsum);
//decode temp to ans
int remaining=19;
for(int j=temp.size()-1;j>=2;j--){
for(int k=temp[j]-1;k>=0;k--){
ans+=dp[j][remaining-k];
}
remaining-=temp[j];
}
ans+=temp[1];
//
output((signed)((ans/(256*256))/256));
ans%=(256*256*256);
output((signed)ans/(256*256));
ans%=(256*256);
output((signed)ans/(256));
ans%=(256);
output((signed)ans);
}
#undef int
return;
}