Submission #996693

# Submission time Handle Problem Language Result Execution time Memory
996693 2024-06-11T05:53:00 Z hotboy2703 Ancient Machine (JOI21_ancient_machine) C++17
100 / 100
78 ms 10380 KB
#include "Anna.h"

#include<bits/stdc++.h>
using ll = int;
using namespace std;
#define pll pair <ll,ll>
#define fi first
#define se second
#define MP make_pair
#define sz(a) (ll((a).size()))
#define BIT(mask,i) (((mask) >> (i))&1)
#define MASK(i) (1LL << (i))
namespace BIGNUM_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;
        }
        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;
        }

        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;
        }
    };
}
namespace A{
    const ll BIG = 1000;
    const ll SMALL = 699;
    struct pt{
        ll type,l,r;
    };
    using namespace BIGNUM_A;
    bigint fibo[BIG+10];
    bigint p2[BIG+10];
    void init(){
        fibo[0] = 1;
        fibo[1] = 2;
        for (ll j = 2;j < BIG;j ++)fibo[j] = fibo[j-2] + fibo[j-1];
        p2[0] = 1;
        for (ll i = 1;i < SMALL;i ++)p2[i] = p2[i-1]*2;
    }
}

void Anna(int N, std::vector<char> S) {
    using namespace A;
    using namespace BIGNUM_A;
    vector <ll> a;
    for (ll i = 0;i < N;i ++){
        a.push_back(S[i]-'X');
    }
//    for (auto x:a)cout<<x<<' ';
//    cout<<'\n';
    vector <ll> res(N+BIG);
    vector <pt> nw;
    for (ll i = 0;i < N;i ++){
        ll j = i;
        while (j + 1 < N && a[j+1] == a[i])j++;
        nw.push_back({a[i],i,j});
        i = j;
    }
    while (!nw.empty() && nw.back().type != 2){
        nw.pop_back();
    }
    ll last0 = -1;
    for (ll i = 0;i < sz(nw);i ++){
        if (last0 == -1){
            if (nw[i].type == 0){res[nw[i].r] = 1;last0 = nw[i].r;}
        }
        else{
            ll j = i;
            while (nw[j].type != 2)j++;
            bool ok = 0;
            for (ll k = j-1;k >= i;k --){
                if (nw[k].type==1)ok = 1;
            }
            res[nw[j].r] = 1;
            i = j;
        }
    }
//    for (auto x:res)cout<<x<<' ';
//    cout<<'\n';
//for (ll i = 0;i < N;i ++)cout<<res[i]<<' ';
//    cout<<'\n';
    init();
    vector <ll> res2;
    if (last0 != -1){
        for (ll j = 0;j < 20;j ++)res2.push_back(BIT(last0,j));
        for (ll j = last0 + 1;j < N;j += BIG){
            bigint mask = 0;
            bigint mul = 1;
            for (ll k = 0;k < BIG;k ++){
                mask += fibo[k] * res[j+k];
            }
            vector <ll> tmp;
            for (ll k = SMALL - 1;k >= 0;k --){
                if (mask >= p2[k]){
                    mask -= p2[k];
                    tmp.push_back(1);
                }
                else tmp.push_back(0);
            }
            for (ll k = SMALL-1;k >= 0;k --)res2.push_back(tmp[k]);
        }
    }
    else{
    }
//    cout<<"DONE"<<endl;
    for (auto x:res2)Send(x);
}
#include "Bruno.h"

#include<bits/stdc++.h>
using ll = int;
using namespace std;
#define pll pair <ll,ll>
#define fi first
#define se second
#define MP make_pair
#define sz(a) (ll((a).size()))
#define BIT(mask,i) (((mask) >> (i))&1)
#define MASK(i) (1LL << (i))
namespace BIGNUM_B{
    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;
        }
        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;
        }

        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;
        }
    };
}
namespace B{
    const ll BIG = 1000;
    const ll SMALL = 699;
    using namespace BIGNUM_B;
    bigint fibo[BIG+10];
    void init(){
        fibo[0] = 1;
        fibo[1] = 2;
        for (ll j = 2;j < BIG;j ++)fibo[j] = fibo[j-2] + fibo[j-1];
    }
}  // namespace

void Bruno(int N, int L, std::vector<int> A) {
    using namespace B;
    using namespace BIGNUM_B;
    init();
    vector <ll> a(N+BIG);
    if (!A.empty()){
        ll last0 = 0;
        for (ll i = 0;i < 20;i ++)last0 += MASK(i) * A[i];
//        cout<<last0<<'\n';
        a[last0] = 1;
        for (ll i = 20,ptr_a = last0 + 1;i < sz(A);i += SMALL,ptr_a += BIG){
            bigint mask = 0;
            bigint mul = 1;
            for (ll j = 0;j < SMALL;j ++){mask += mul * A[i+j];mul*=2;}
            for (ll j = BIG-1;j >= 0;j --){
                if (mask >= fibo[j]){
                    mask -= fibo[j];
                    a[ptr_a+j] = 1;
                }
            }
        }
    }
//    for (ll i = 0;i < N;i ++)cout<<a[i]<<' ';
//    cout<<'\n';
    vector <bool> del(N);
    ll last = -1;
    ll first = -1;
    for (ll i = 0;i < N;i ++){
        if (a[i]){
            if (first==-1)first = a[i];
            else{
                for (ll j = i - 1;j > last;j --){del[j] = 1;Remove(j);}
                del[i] = 1;Remove(i);
            }
            last = i;
        }
    }
    for (ll i = 0;i < N;i ++){
        if (!del[i]){
            Remove(i);
        }
    }
}

Compilation message

Anna.cpp: In function 'void Anna(int, std::vector<char>)':
Anna.cpp:462:18: warning: variable 'ok' set but not used [-Wunused-but-set-variable]
  462 |             bool ok = 0;
      |                  ^~
# Verdict Execution time Memory Grader output
1 Correct 1 ms 1032 KB Output is correct
2 Correct 1 ms 1040 KB Output is correct
3 Correct 1 ms 1044 KB Output is correct
4 Correct 1 ms 1036 KB Output is correct
5 Correct 0 ms 1048 KB Output is correct
6 Correct 1 ms 1048 KB Output is correct
7 Correct 1 ms 1048 KB Output is correct
8 Correct 1 ms 1036 KB Output is correct
9 Correct 1 ms 1044 KB Output is correct
10 Correct 0 ms 1048 KB Output is correct
11 Correct 1 ms 1048 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 71 ms 10000 KB Output is correct
2 Correct 69 ms 9964 KB Output is correct
3 Correct 74 ms 10048 KB Output is correct
4 Correct 67 ms 10028 KB Output is correct
5 Correct 69 ms 9992 KB Output is correct
6 Correct 68 ms 10008 KB Output is correct
7 Correct 75 ms 9988 KB Output is correct
8 Correct 67 ms 10000 KB Output is correct
9 Correct 68 ms 10000 KB Output is correct
10 Correct 78 ms 9980 KB Output is correct
11 Correct 67 ms 9988 KB Output is correct
12 Correct 72 ms 9992 KB Output is correct
13 Correct 52 ms 10256 KB Output is correct
14 Correct 74 ms 10236 KB Output is correct
15 Correct 72 ms 10244 KB Output is correct
16 Correct 73 ms 10380 KB Output is correct
17 Correct 33 ms 7464 KB Output is correct
18 Correct 32 ms 7464 KB Output is correct
19 Correct 33 ms 7564 KB Output is correct
20 Correct 70 ms 10296 KB Output is correct
21 Correct 68 ms 10248 KB Output is correct
22 Correct 51 ms 9264 KB Output is correct
23 Correct 68 ms 10004 KB Output is correct
24 Correct 68 ms 10000 KB Output is correct
25 Correct 32 ms 7608 KB Output is correct
26 Correct 31 ms 7808 KB Output is correct
27 Correct 33 ms 7816 KB Output is correct
28 Correct 34 ms 7604 KB Output is correct
29 Correct 34 ms 7796 KB Output is correct
30 Correct 32 ms 7720 KB Output is correct
31 Correct 34 ms 7540 KB Output is correct
32 Correct 69 ms 9964 KB Output is correct
33 Correct 67 ms 9884 KB Output is correct