Submission #1322010

#TimeUsernameProblemLanguageResultExecution timeMemory
1322010binminh01Parrots (IOI11_parrots)C++20
100 / 100
51 ms20032 KiB
#include "encoder.h"
#include "encoderlib.h"

#include<bits/stdc++.h>
using namespace std;
#define ll long long
using vi = vector<int>;
using vll = vector<ll>;
#define For(i, a, b) for (auto i = (a); i < (b); ++i)
#define Fore(i, a, b) for (auto i = (a); i >= (b); --i)
#define FOR(i, a, b) for (auto i = (a); i <= (b); ++i)

namespace A {
    const int base = 1000000000;
    const int base_digits = 9; 
    struct bigint {
        vector<int> a;
        int sign;
        /*<arpa>*/
        int size(){
            if(a.empty())return 0;
            int ans=(a.size()-1)*base_digits;
            int ca=a.back();
            while(ca)
                ans++,ca/=10;
            return ans;
        }
        bigint operator ^(const bigint &v){
            bigint ans=1,a=*this,b=v;
            while(!b.isZero()){
                if(b%2)
                    ans*=a;
                a*=a,b/=2;
            }
            return ans;
        }
        bigint modPow(bigint base, bigint exp, const bigint &mod) {
            bigint result = 1;
            base %= mod;
            while (!exp.isZero()) {
                if (exp % 2)
                    result = (result * base) % mod;
                base = (base * base) % mod;
                exp /= 2;
            }
            return result;
        }
        string to_string(){
            stringstream ss;
            ss << *this;
            string s;
            ss >> s;
            return s;
        }
        int sumof(){
            string s = to_string();
            int ans = 0;
            for(auto c : s)  ans += c - '0';
            return ans;
        }
        /*</arpa>*/
        bigint() :
            sign(1) {
        }
    
        bigint(long long v) {
            *this = v;
        }
    
        bigint(const string &s) {
            read(s);
        }
    
        void operator=(const bigint &v) {
            sign = v.sign;
            a = v.a;
        }
    
        void operator=(long long v) {
            sign = 1;
            a.clear();
            if (v < 0)
                sign = -1, v = -v;
            for (; v > 0; v = v / base)
                a.push_back(v % base);
        }
    
        bigint operator+(const bigint &v) const {
            if (sign == v.sign) {
                bigint res = v;
    
                for (int i = 0, carry = 0; i < (int) max(a.size(), v.a.size()) || carry; ++i) {
                    if (i == (int) res.a.size())
                        res.a.push_back(0);
                    res.a[i] += carry + (i < (int) a.size() ? a[i] : 0);
                    carry = res.a[i] >= base;
                    if (carry)
                        res.a[i] -= base;
                }
                return res;
            }
            return *this - (-v);
        }
    
        bigint operator-(const bigint &v) const {
            if (sign == v.sign) {
                if (abs() >= v.abs()) {
                    bigint res = *this;
                    for (int i = 0, carry = 0; i < (int) v.a.size() || carry; ++i) {
                        res.a[i] -= carry + (i < (int) v.a.size() ? v.a[i] : 0);
                        carry = res.a[i] < 0;
                        if (carry)
                            res.a[i] += base;
                    }
                    res.trim();
                    return res;
                }
                return -(v - *this);
            }
            return *this + (-v);
        }
    
        void operator*=(int v) {
            if (v < 0)
                sign = -sign, v = -v;
            for (int i = 0, carry = 0; i < (int) a.size() || carry; ++i) {
                if (i == (int) a.size())
                    a.push_back(0);
                long long cur = a[i] * (long long) v + carry;
                carry = (int) (cur / base);
                a[i] = (int) (cur % base);
                //asm("divl %%ecx" : "=a"(carry), "=d"(a[i]) : "A"(cur), "c"(base));
            }
            trim();
        }
    
        bigint operator*(int v) const {
            bigint res = *this;
            res *= v;
            return res;
        }
    
        void operator*=(long long v) {
            if (v < 0)
                sign = -sign, v = -v;
            if(v > base){
                *this = *this * (v / base) * base + *this * (v % base);
                return ;
            }
            for (int i = 0, carry = 0; i < (int) a.size() || carry; ++i) {
                if (i == (int) a.size())
                    a.push_back(0);
                long long cur = a[i] * (long long) v + carry;
                carry = (int) (cur / base);
                a[i] = (int) (cur % base);
                //asm("divl %%ecx" : "=a"(carry), "=d"(a[i]) : "A"(cur), "c"(base));
            }
            trim();
        }
    
        bigint operator*(long long v) const {
            bigint res = *this;
            res *= v;
            return res;
        }
    
        friend pair<bigint, bigint> divmod(const bigint &a1, const bigint &b1) {
            int norm = base / (b1.a.back() + 1);
            bigint a = a1.abs() * norm;
            bigint b = b1.abs() * norm;
            bigint q, r;
            q.a.resize(a.a.size());
    
            for (int i = a.a.size() - 1; i >= 0; i--) {
                r *= base;
                r += a.a[i];
                int s1 = r.a.size() <= b.a.size() ? 0 : r.a[b.a.size()];
                int s2 = r.a.size() <= b.a.size() - 1 ? 0 : r.a[b.a.size() - 1];
                int d = ((long long) base * s1 + s2) / b.a.back();
                r -= b * d;
                while (r < 0)
                    r += b, --d;
                q.a[i] = d;
            }
    
            q.sign = a1.sign * b1.sign;
            r.sign = a1.sign;
            q.trim();
            r.trim();
            return make_pair(q, r / norm);
        }
    
        bigint operator/(const bigint &v) const {
            return divmod(*this, v).first;
        }
    
        bigint operator%(const bigint &v) const {
            return divmod(*this, v).second;
        }
    
        void operator/=(int v) {
            if (v < 0)
                sign = -sign, v = -v;
            for (int i = (int) a.size() - 1, rem = 0; i >= 0; --i) {
                long long cur = a[i] + rem * (long long) base;
                a[i] = (int) (cur / v);
                rem = (int) (cur % v);
            }
            trim();
        }
    
        bigint operator/(int v) const {
            bigint res = *this;
            res /= v;
            return res;
        }
    
        int operator%(int v) const {
            if (v < 0)
                v = -v;
            int m = 0;
            for (int i = a.size() - 1; i >= 0; --i)
                m = (a[i] + m * (long long) base) % v;
            return m * sign;
        }
    
        void operator+=(const bigint &v) {
            *this = *this + v;
        }
        void operator-=(const bigint &v) {
            *this = *this - v;
        }
        void operator*=(const bigint &v) {
            *this = *this * v;
        }
        void operator/=(const bigint &v) {
            *this = *this / v;
        }
        void operator%=(const bigint &v){
            *this = *this % v;
        } 
        bool operator<(const bigint &v) const {
            if (sign != v.sign)
                return sign < v.sign;
            if (a.size() != v.a.size())
                return a.size() * sign < v.a.size() * v.sign;
            for (int i = a.size() - 1; i >= 0; i--)
                if (a[i] != v.a[i])
                    return a[i] * sign < v.a[i] * sign;
            return false;
        }
    
        bool operator>(const bigint &v) const {
            return v < *this;
        }
        bool operator<=(const bigint &v) const {
            return !(v < *this);
        }
        bool operator>=(const bigint &v) const {
            return !(*this < v);
        }
        bool operator==(const bigint &v) const {
            return !(*this < v) && !(v < *this);
        }
        bool operator!=(const bigint &v) const {
            return *this < v || v < *this;
        }
    
        void trim() {
            while (!a.empty() && !a.back())
                a.pop_back();
            if (a.empty())
                sign = 1;
        }
    
        bool isZero() const {
            return a.empty() || (a.size() == 1 && !a[0]);
        }
    
        bigint operator-() const {
            bigint res = *this;
            res.sign = -sign;
            return res;
        }
    
        bigint abs() const {
            bigint res = *this;
            res.sign *= res.sign;
            return res;
        }
    
        long long longValue() const {
            long long res = 0;
            for (int i = a.size() - 1; i >= 0; i--)
                res = res * base + a[i];
            return res * sign;
        }
    
        friend bigint gcd(const bigint &a, const bigint &b) {
            return b.isZero() ? a : gcd(b, a % b);
        }
        friend bigint lcm(const bigint &a, const bigint &b) {
            return a / gcd(a, b) * b;
        }
    
        void read(const string &s) {
            sign = 1;
            a.clear();
            int pos = 0;
            while (pos < (int) s.size() && (s[pos] == '-' || s[pos] == '+')) {
                if (s[pos] == '-')
                    sign = -sign;
                ++pos;
            }
            for (int i = s.size() - 1; i >= pos; i -= base_digits) {
                int x = 0;
                for (int j = max(pos, i - base_digits + 1); j <= i; j++)
                    x = x * 10 + s[j] - '0';
                a.push_back(x);
            }
            trim();
        }
    
        friend istream& operator>>(istream &stream, bigint &v) {
            string s;
            stream >> s;
            v.read(s);
            return stream;
        }
    
        friend ostream& operator<<(ostream &stream, const bigint &v) {
            if (v.sign == -1)
                stream << '-';
            stream << (v.a.empty() ? 0 : v.a.back());
            for (int i = (int) v.a.size() - 2; i >= 0; --i)
                stream << setw(base_digits) << setfill('0') << v.a[i];
            return stream;
        }
    
        static vector<int> convert_base(const vector<int> &a, int old_digits, int new_digits) {
            vector<long long> p(max(old_digits, new_digits) + 1);
            p[0] = 1;
            for (int i = 1; i < (int) p.size(); i++)
                p[i] = p[i - 1] * 10;
            vector<int> res;
            long long cur = 0;
            int cur_digits = 0;
            for (int i = 0; i < (int) a.size(); i++) {
                cur += a[i] * p[cur_digits];
                cur_digits += old_digits;
                while (cur_digits >= new_digits) {
                    res.push_back(int(cur % p[new_digits]));
                    cur /= p[new_digits];
                    cur_digits -= new_digits;
                }
            }
            res.push_back((int) cur);
            while (!res.empty() && !res.back())
                res.pop_back();
            return res;
        }
    
        typedef vector<long long> vll;
    
        static vll karatsubaMultiply(const vll &a, const vll &b) {
            int n = a.size();
            vll res(n + n);
            if (n <= 32) {
                for (int i = 0; i < n; i++)
                    for (int j = 0; j < n; j++)
                        res[i + j] += a[i] * b[j];
                return res;
            }
    
            int k = n >> 1;
            vll a1(a.begin(), a.begin() + k);
            vll a2(a.begin() + k, a.end());
            vll b1(b.begin(), b.begin() + k);
            vll b2(b.begin() + k, b.end());
    
            vll a1b1 = karatsubaMultiply(a1, b1);
            vll a2b2 = karatsubaMultiply(a2, b2);
    
            for (int i = 0; i < k; i++)
                a2[i] += a1[i];
            for (int i = 0; i < k; i++)
                b2[i] += b1[i];
    
            vll r = karatsubaMultiply(a2, b2);
            for (int i = 0; i < (int) a1b1.size(); i++)
                r[i] -= a1b1[i];
            for (int i = 0; i < (int) a2b2.size(); i++)
                r[i] -= a2b2[i];
    
            for (int i = 0; i < (int) r.size(); i++)
                res[i + k] += r[i];
            for (int i = 0; i < (int) a1b1.size(); i++)
                res[i] += a1b1[i];
            for (int i = 0; i < (int) a2b2.size(); i++)
                res[i + n] += a2b2[i];
            return res;
        }
    
        bigint operator*(const bigint &v) const {
            vector<int> a6 = convert_base(this->a, base_digits, 6);
            vector<int> b6 = convert_base(v.a, base_digits, 6);
            vll a(a6.begin(), a6.end());
            vll b(b6.begin(), b6.end());
            while (a.size() < b.size())
                a.push_back(0);
            while (b.size() < a.size())
                b.push_back(0);
            while (a.size() & (a.size() - 1))
                a.push_back(0), b.push_back(0);
            vll c = karatsubaMultiply(a, b);
            bigint res;
            res.sign = sign * v.sign;
            for (int i = 0, carry = 0; i < (int) c.size(); i++) {
                long long cur = c[i] + carry;
                res.a.push_back((int) (cur % 1000000));
                carry = (int) (cur / 1000000);
            }
            res.a = convert_base(res.a, 6, base_digits);
            res.trim();
            return res;
        }
    };
    bigint C[576][576], pw[513];
    bool prep = 0;
    void calc() {
        prep = 1;
        C[0][0] = 1, pw[0] = 1;
        FOR(i,1,512) pw[i] = pw[i - 1] + pw[i - 1];
        FOR(n,1,575){
            C[n][0] = 1, C[n][n] = 1;
            For(k,1,n) C[n][k] = C[n - 1][k] + C[n - 1][k - 1];
        }
    }
    void encode(int n, int a[]) {
        if (!prep) calc();
        bigint x = 0;
        For(i,0,n) For(j,0,8) if (a[i] >> j & 1) x+=pw[8*i + j];
        int m = 5*n, s = 255, t = 0;
        For(i,0,m) FOR(j,0,255){
            if (x >= C[s - j + m - i - 1][m - i - 1]) x-=C[s - j + m - i - 1][m - i - 1];
            else {
                s-=j, t+=j;
                send(t);
                break;
            }
        }
    }
};

void encode(int n, int a[]) {
    A::encode(n, a);
}
#include "decoder.h"
#include "decoderlib.h"

#include<bits/stdc++.h>
using namespace std;
#define ll long long
using vi = vector<int>;
using vll = vector<ll>;
#define For(i, a, b) for (auto i = (a); i < (b); ++i)
#define Fore(i, a, b) for (auto i = (a); i >= (b); --i)
#define FOR(i, a, b) for (auto i = (a); i <= (b); ++i)

namespace B {
	int base = 1000000000;
	int base_digits = 9; 
	struct bigint {
		vector<int> a;
		int sign;
		/*<arpa>*/
		int size(){
			if(a.empty())return 0;
			int ans=(a.size()-1)*base_digits;
			int ca=a.back();
			while(ca)
				ans++,ca/=10;
			return ans;
		}
		bigint operator ^(const bigint &v){
			bigint ans=1,a=*this,b=v;
			while(!b.isZero()){
				if(b%2)
					ans*=a;
				a*=a,b/=2;
			}
			return ans;
		}
		bigint modPow(bigint base, bigint exp, const bigint &mod) {
			bigint result = 1;
			base %= mod;
			while (!exp.isZero()) {
				if (exp % 2)
					result = (result * base) % mod;
				base = (base * base) % mod;
				exp /= 2;
			}
			return result;
		}
		string to_string(){
			stringstream ss;
			ss << *this;
			string s;
			ss >> s;
			return s;
		}
		int sumof(){
			string s = to_string();
			int ans = 0;
			for(auto c : s)  ans += c - '0';
			return ans;
		}
		/*</arpa>*/
		bigint() :
			sign(1) {
		}
	
		bigint(long long v) {
			*this = v;
		}
	
		bigint(const string &s) {
			read(s);
		}
	
		void operator=(const bigint &v) {
			sign = v.sign;
			a = v.a;
		}
	
		void operator=(long long v) {
			sign = 1;
			a.clear();
			if (v < 0)
				sign = -1, v = -v;
			for (; v > 0; v = v / base)
				a.push_back(v % base);
		}
	
		bigint operator+(const bigint &v) const {
			if (sign == v.sign) {
				bigint res = v;
	
				for (int i = 0, carry = 0; i < (int) max(a.size(), v.a.size()) || carry; ++i) {
					if (i == (int) res.a.size())
						res.a.push_back(0);
					res.a[i] += carry + (i < (int) a.size() ? a[i] : 0);
					carry = res.a[i] >= base;
					if (carry)
						res.a[i] -= base;
				}
				return res;
			}
			return *this - (-v);
		}
	
		bigint operator-(const bigint &v) const {
			if (sign == v.sign) {
				if (abs() >= v.abs()) {
					bigint res = *this;
					for (int i = 0, carry = 0; i < (int) v.a.size() || carry; ++i) {
						res.a[i] -= carry + (i < (int) v.a.size() ? v.a[i] : 0);
						carry = res.a[i] < 0;
						if (carry)
							res.a[i] += base;
					}
					res.trim();
					return res;
				}
				return -(v - *this);
			}
			return *this + (-v);
		}
	
		void operator*=(int v) {
			if (v < 0)
				sign = -sign, v = -v;
			for (int i = 0, carry = 0; i < (int) a.size() || carry; ++i) {
				if (i == (int) a.size())
					a.push_back(0);
				long long cur = a[i] * (long long) v + carry;
				carry = (int) (cur / base);
				a[i] = (int) (cur % base);
				//asm("divl %%ecx" : "=a"(carry), "=d"(a[i]) : "A"(cur), "c"(base));
			}
			trim();
		}
	
		bigint operator*(int v) const {
			bigint res = *this;
			res *= v;
			return res;
		}
	
		void operator*=(long long v) {
			if (v < 0)
				sign = -sign, v = -v;
			if(v > base){
				*this = *this * (v / base) * base + *this * (v % base);
				return ;
			}
			for (int i = 0, carry = 0; i < (int) a.size() || carry; ++i) {
				if (i == (int) a.size())
					a.push_back(0);
				long long cur = a[i] * (long long) v + carry;
				carry = (int) (cur / base);
				a[i] = (int) (cur % base);
				//asm("divl %%ecx" : "=a"(carry), "=d"(a[i]) : "A"(cur), "c"(base));
			}
			trim();
		}
	
		bigint operator*(long long v) const {
			bigint res = *this;
			res *= v;
			return res;
		}
	
		friend pair<bigint, bigint> divmod(const bigint &a1, const bigint &b1) {
			int norm = base / (b1.a.back() + 1);
			bigint a = a1.abs() * norm;
			bigint b = b1.abs() * norm;
			bigint q, r;
			q.a.resize(a.a.size());
	
			for (int i = a.a.size() - 1; i >= 0; i--) {
				r *= base;
				r += a.a[i];
				int s1 = r.a.size() <= b.a.size() ? 0 : r.a[b.a.size()];
				int s2 = r.a.size() <= b.a.size() - 1 ? 0 : r.a[b.a.size() - 1];
				int d = ((long long) base * s1 + s2) / b.a.back();
				r -= b * d;
				while (r < 0)
					r += b, --d;
				q.a[i] = d;
			}
	
			q.sign = a1.sign * b1.sign;
			r.sign = a1.sign;
			q.trim();
			r.trim();
			return make_pair(q, r / norm);
		}
	
		bigint operator/(const bigint &v) const {
			return divmod(*this, v).first;
		}
	
		bigint operator%(const bigint &v) const {
			return divmod(*this, v).second;
		}
	
		void operator/=(int v) {
			if (v < 0)
				sign = -sign, v = -v;
			for (int i = (int) a.size() - 1, rem = 0; i >= 0; --i) {
				long long cur = a[i] + rem * (long long) base;
				a[i] = (int) (cur / v);
				rem = (int) (cur % v);
			}
			trim();
		}
	
		bigint operator/(int v) const {
			bigint res = *this;
			res /= v;
			return res;
		}
	
		int operator%(int v) const {
			if (v < 0)
				v = -v;
			int m = 0;
			for (int i = a.size() - 1; i >= 0; --i)
				m = (a[i] + m * (long long) base) % v;
			return m * sign;
		}
	
		void operator+=(const bigint &v) {
			*this = *this + v;
		}
		void operator-=(const bigint &v) {
			*this = *this - v;
		}
		void operator*=(const bigint &v) {
			*this = *this * v;
		}
		void operator/=(const bigint &v) {
			*this = *this / v;
		}
		void operator%=(const bigint &v){
			*this = *this % v;
		} 
		bool operator<(const bigint &v) const {
			if (sign != v.sign)
				return sign < v.sign;
			if (a.size() != v.a.size())
				return a.size() * sign < v.a.size() * v.sign;
			for (int i = a.size() - 1; i >= 0; i--)
				if (a[i] != v.a[i])
					return a[i] * sign < v.a[i] * sign;
			return false;
		}
	
		bool operator>(const bigint &v) const {
			return v < *this;
		}
		bool operator<=(const bigint &v) const {
			return !(v < *this);
		}
		bool operator>=(const bigint &v) const {
			return !(*this < v);
		}
		bool operator==(const bigint &v) const {
			return !(*this < v) && !(v < *this);
		}
		bool operator!=(const bigint &v) const {
			return *this < v || v < *this;
		}
	
		void trim() {
			while (!a.empty() && !a.back())
				a.pop_back();
			if (a.empty())
				sign = 1;
		}
	
		bool isZero() const {
			return a.empty() || (a.size() == 1 && !a[0]);
		}
	
		bigint operator-() const {
			bigint res = *this;
			res.sign = -sign;
			return res;
		}
	
		bigint abs() const {
			bigint res = *this;
			res.sign *= res.sign;
			return res;
		}
	
		long long longValue() const {
			long long res = 0;
			for (int i = a.size() - 1; i >= 0; i--)
				res = res * base + a[i];
			return res * sign;
		}
	
		friend bigint gcd(const bigint &a, const bigint &b) {
			return b.isZero() ? a : gcd(b, a % b);
		}
		friend bigint lcm(const bigint &a, const bigint &b) {
			return a / gcd(a, b) * b;
		}
	
		void read(const string &s) {
			sign = 1;
			a.clear();
			int pos = 0;
			while (pos < (int) s.size() && (s[pos] == '-' || s[pos] == '+')) {
				if (s[pos] == '-')
					sign = -sign;
				++pos;
			}
			for (int i = s.size() - 1; i >= pos; i -= base_digits) {
				int x = 0;
				for (int j = max(pos, i - base_digits + 1); j <= i; j++)
					x = x * 10 + s[j] - '0';
				a.push_back(x);
			}
			trim();
		}
	
		friend istream& operator>>(istream &stream, bigint &v) {
			string s;
			stream >> s;
			v.read(s);
			return stream;
		}
	
		friend ostream& operator<<(ostream &stream, const bigint &v) {
			if (v.sign == -1)
				stream << '-';
			stream << (v.a.empty() ? 0 : v.a.back());
			for (int i = (int) v.a.size() - 2; i >= 0; --i)
				stream << setw(base_digits) << setfill('0') << v.a[i];
			return stream;
		}
	
		static vector<int> convert_base(const vector<int> &a, int old_digits, int new_digits) {
			vector<long long> p(max(old_digits, new_digits) + 1);
			p[0] = 1;
			for (int i = 1; i < (int) p.size(); i++)
				p[i] = p[i - 1] * 10;
			vector<int> res;
			long long cur = 0;
			int cur_digits = 0;
			for (int i = 0; i < (int) a.size(); i++) {
				cur += a[i] * p[cur_digits];
				cur_digits += old_digits;
				while (cur_digits >= new_digits) {
					res.push_back(int(cur % p[new_digits]));
					cur /= p[new_digits];
					cur_digits -= new_digits;
				}
			}
			res.push_back((int) cur);
			while (!res.empty() && !res.back())
				res.pop_back();
			return res;
		}
	
		typedef vector<long long> vll;
	
		static vll karatsubaMultiply(const vll &a, const vll &b) {
			int n = a.size();
			vll res(n + n);
			if (n <= 32) {
				for (int i = 0; i < n; i++)
					for (int j = 0; j < n; j++)
						res[i + j] += a[i] * b[j];
				return res;
			}
	
			int k = n >> 1;
			vll a1(a.begin(), a.begin() + k);
			vll a2(a.begin() + k, a.end());
			vll b1(b.begin(), b.begin() + k);
			vll b2(b.begin() + k, b.end());
	
			vll a1b1 = karatsubaMultiply(a1, b1);
			vll a2b2 = karatsubaMultiply(a2, b2);
	
			for (int i = 0; i < k; i++)
				a2[i] += a1[i];
			for (int i = 0; i < k; i++)
				b2[i] += b1[i];
	
			vll r = karatsubaMultiply(a2, b2);
			for (int i = 0; i < (int) a1b1.size(); i++)
				r[i] -= a1b1[i];
			for (int i = 0; i < (int) a2b2.size(); i++)
				r[i] -= a2b2[i];
	
			for (int i = 0; i < (int) r.size(); i++)
				res[i + k] += r[i];
			for (int i = 0; i < (int) a1b1.size(); i++)
				res[i] += a1b1[i];
			for (int i = 0; i < (int) a2b2.size(); i++)
				res[i + n] += a2b2[i];
			return res;
		}
	
		bigint operator*(const bigint &v) const {
			vector<int> a6 = convert_base(this->a, base_digits, 6);
			vector<int> b6 = convert_base(v.a, base_digits, 6);
			vll a(a6.begin(), a6.end());
			vll b(b6.begin(), b6.end());
			while (a.size() < b.size())
				a.push_back(0);
			while (b.size() < a.size())
				b.push_back(0);
			while (a.size() & (a.size() - 1))
				a.push_back(0), b.push_back(0);
			vll c = karatsubaMultiply(a, b);
			bigint res;
			res.sign = sign * v.sign;
			for (int i = 0, carry = 0; i < (int) c.size(); i++) {
				long long cur = c[i] + carry;
				res.a.push_back((int) (cur % 1000000));
				carry = (int) (cur / 1000000);
			}
			res.a = convert_base(res.a, 6, base_digits);
			res.trim();
			return res;
		}
	};
    bigint C[576][576], pw[513];
    bool prep = 0;
    void calc() {
        prep = 1;
        C[0][0] = 1, pw[0] = 1;
        FOR(i,1,512) pw[i] = pw[i - 1] + pw[i - 1];
        FOR(n,1,575){
            C[n][0] = 1, C[n][n] = 1;
            For(k,1,n) C[n][k] = C[n - 1][k] + C[n - 1][k - 1];
        }
    }
	void decode(int n, int m, int a[]) {
		if (!prep) calc();
		assert(m == 5*n);
		sort(a, a + m);
		bigint x = 0;
		int s = 255 - a[m - 1];
		Fore(i,m-1,1) a[i]-=a[i - 1];
		Fore(i,m-1,0){
			For(j,0,a[i]) x+=C[s + a[i] - j + m - i - 1][m - i - 1];
			s+=a[i];
		}
		vi f(n);
		Fore(i,n-1,0) Fore(j,7,0) if (x >= pw[8*i + j]) f[i]^=1 << j, x-=pw[8*i + j];
		For(i,0,n) output(f[i]);
	}
};

void decode(int n, int m, int a[]) {
	B::decode(n, m, a);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...