답안 #1045784

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1045784 2024-08-06T07:42:37 Z ksun69(#11074) Ancient Machine 2 (JOI23_ancient2) C++17
20 / 100
13 ms 1032 KB
#include "ancient2.h"
#include <bits/stdc++.h>

using namespace std;

// Fast Fourier transform
// https://cp-algorithms.com/algebra/fft.html
// https://drive.google.com/file/d/1B9BIfATnI_qL6rYiE5hY9bh20SMVmHZ7/view

using cpx = complex<double>;
const double PI = acos(-1);
vector<cpx> roots = {{0, 0}, {1, 0}};

void ensure_capacity(int min_capacity) {
    for (int len = roots.size(); len < min_capacity; len *= 2) {
        for (int i = len >> 1; i < len; i++) {
            roots.emplace_back(roots[i]);
            double angle = 2 * PI * (2 * i + 1 - len) / (len * 2);
            roots.emplace_back(cos(angle), sin(angle));
        }
    }
}

void fft(vector<cpx> &z, bool inverse) {
    int n = z.size();
    assert((n & (n - 1)) == 0);
    ensure_capacity(n);
    for (unsigned i = 1, j = 0; i < n; i++) {
        int bit = n >> 1;
        for (; j >= bit; bit >>= 1)
            j -= bit;
        j += bit;
        if (i < j)
            swap(z[i], z[j]);
    }
    for (int len = 1; len < n; len <<= 1) {
        for (int i = 0; i < n; i += len * 2) {
            for (int j = 0; j < len; j++) {
                cpx root = inverse ? conj(roots[j + len]) : roots[j + len];
                cpx u = z[i + j];
                cpx v = z[i + j + len] * root;
                z[i + j] = u + v;
                z[i + j + len] = u - v;
            }
        }
    }
    if (inverse)
        for (int i = 0; i < n; i++)
            z[i] /= n;
}

vector<int> multiply_bigint(const vector<int> &a, const vector<int> &b, int base) {
    int need = a.size() + b.size();
    int n = 1;
    while (n < need)
        n <<= 1;
    vector<cpx> p(n);
    for (size_t i = 0; i < n; i++) {
        p[i] = cpx(i < a.size() ? a[i] : 0, i < b.size() ? b[i] : 0);
    }
    fft(p, false);
    // a[w[k]] = (p[w[k]] + conj(p[w[n-k]])) / 2
    // b[w[k]] = (p[w[k]] - conj(p[w[n-k]])) / (2*i)
    vector<cpx> ab(n);
    cpx r(0, -0.25);
    for (int i = 0; i < n; i++) {
        int j = (n - i) & (n - 1);
        ab[i] = (p[i] * p[i] - conj(p[j] * p[j])) * r;
    }
    fft(ab, true);
    vector<int> result(need);
    long long carry = 0;
    for (int i = 0; i < need; i++) {
        long long d = (long long)(ab[i].real() + 0.5) + carry;
        carry = d / base;
        result[i] = d % base;
    }
    return result;
}

vector<int> multiply_mod(const vector<int> &a, const vector<int> &b, int m) {
    int need = a.size() + b.size() - 1;
    int n = 1;
    while (n < need)
        n <<= 1;
    vector<cpx> A(n);
    for (size_t i = 0; i < a.size(); i++) {
        int x = (a[i] % m + m) % m;
        A[i] = cpx(x & ((1 << 15) - 1), x >> 15);
    }
    fft(A, false);

    vector<cpx> B(n);
    for (size_t i = 0; i < b.size(); i++) {
        int x = (b[i] % m + m) % m;
        B[i] = cpx(x & ((1 << 15) - 1), x >> 15);
    }
    fft(B, false);

    vector<cpx> fa(n);
    vector<cpx> fb(n);
    for (int i = 0, j = 0; i < n; i++, j = n - i) {
        cpx a1 = (A[i] + conj(A[j])) * cpx(0.5, 0);
        cpx a2 = (A[i] - conj(A[j])) * cpx(0, -0.5);
        cpx b1 = (B[i] + conj(B[j])) * cpx(0.5, 0);
        cpx b2 = (B[i] - conj(B[j])) * cpx(0, -0.5);
        fa[i] = a1 * b1 + a2 * b2 * cpx(0, 1);
        fb[i] = a1 * b2 + a2 * b1;
    }

    fft(fa, true);
    fft(fb, true);
    vector<int> res(need);
    for (int i = 0; i < need; i++) {
        long long aa = (long long)(fa[i].real() + 0.5);
        long long bb = (long long)(fb[i].real() + 0.5);
        long long cc = (long long)(fa[i].imag() + 0.5);
        res[i] = (aa % m + (bb % m << 15) + (cc % m << 30)) % m;
    }
    return res;
}

constexpr int digits(int base) noexcept {
    return base <= 1 ? 0 : 1 + digits(base / 10);
}

constexpr int base = 1000'000'000;
constexpr int base_digits = digits(base);

constexpr int fft_base = 10'000;  // fft_base^2 * n / fft_base_digits <= 10^15 for double
constexpr int fft_base_digits = digits(fft_base);

struct bigint {
    // value == 0 is represented by empty z
    vector<int> z;  // digits

    // sign == 1 <==> value >= 0
    // sign == -1 <==> value < 0
    int sign;

    bigint(long long v = 0) { *this = v; }

    bigint &operator=(long long v) {
        sign = v < 0 ? -1 : 1;
        v *= sign;
        z.clear();
        for (; v > 0; v = v / base)
            z.push_back((int)(v % base));
        return *this;
    }

    bigint(const string &s) { read(s); }

    bigint &operator+=(const bigint &other) {
        if (sign == other.sign) {
            for (int i = 0, carry = 0; i < other.z.size() || carry; ++i) {
                if (i == z.size())
                    z.push_back(0);
                z[i] += carry + (i < other.z.size() ? other.z[i] : 0);
                carry = z[i] >= base;
                if (carry)
                    z[i] -= base;
            }
        } else if (other != 0 /* prevent infinite loop */) {
            *this -= -other;
        }
        return *this;
    }

    friend bigint operator+(bigint a, const bigint &b) {
        a += b;
        return a;
    }

    bigint &operator-=(const bigint &other) {
        if (sign == other.sign) {
            if ((sign == 1 && *this >= other) || (sign == -1 && *this <= other)) {
                for (int i = 0, carry = 0; i < other.z.size() || carry; ++i) {
                    z[i] -= carry + (i < other.z.size() ? other.z[i] : 0);
                    carry = z[i] < 0;
                    if (carry)
                        z[i] += base;
                }
                trim();
            } else {
                *this = other - *this;
                this->sign = -this->sign;
            }
        } else {
            *this += -other;
        }
        return *this;
    }

    friend bigint operator-(bigint a, const bigint &b) {
        a -= b;
        return a;
    }

    bigint &operator*=(int v) {
        if (v < 0)
            sign = -sign, v = -v;
        for (int i = 0, carry = 0; i < z.size() || carry; ++i) {
            if (i == z.size())
                z.push_back(0);
            long long cur = (long long)z[i] * v + carry;
            carry = (int)(cur / base);
            z[i] = (int)(cur % base);
        }
        trim();
        return *this;
    }

    bigint operator*(int v) const { return bigint(*this) *= v; }

    friend pair<bigint, bigint> divmod(const bigint &a1, const bigint &b1) {
        int norm = base / (b1.z.back() + 1);
        bigint a = a1.abs() * norm;
        bigint b = b1.abs() * norm;
        bigint q, r;
        q.z.resize(a.z.size());

        for (int i = (int)a.z.size() - 1; i >= 0; i--) {
            r *= base;
            r += a.z[i];
            int s1 = b.z.size() < r.z.size() ? r.z[b.z.size()] : 0;
            int s2 = b.z.size() - 1 < r.z.size() ? r.z[b.z.size() - 1] : 0;
            int d = (int)(((long long)s1 * base + s2) / b.z.back());
            r -= b * d;
            while (r < 0)
                r += b, --d;
            q.z[i] = d;
        }

        q.sign = a1.sign * b1.sign;
        r.sign = a1.sign;
        q.trim();
        r.trim();
        return {q, r / norm};
    }

    friend bigint sqrt(const bigint &a1) {
        bigint a = a1;
        while (a.z.empty() || a.z.size() % 2 == 1)
            a.z.push_back(0);

        int n = a.z.size();

        int firstDigit = (int)::sqrt((double)a.z[n - 1] * base + a.z[n - 2]);
        int norm = base / (firstDigit + 1);
        a *= norm;
        a *= norm;
        while (a.z.empty() || a.z.size() % 2 == 1)
            a.z.push_back(0);

        bigint r = (long long)a.z[n - 1] * base + a.z[n - 2];
        firstDigit = (int)::sqrt((double)a.z[n - 1] * base + a.z[n - 2]);
        int q = firstDigit;
        bigint res;

        for (int j = n / 2 - 1; j >= 0; j--) {
            for (;; --q) {
                bigint r1 = (r - (res * 2 * base + q) * q) * base * base +
                            (j > 0 ? (long long)a.z[2 * j - 1] * base + a.z[2 * j - 2] : 0);
                if (r1 >= 0) {
                    r = r1;
                    break;
                }
            }
            res *= base;
            res += q;

            if (j > 0) {
                int d1 = res.z.size() + 2 < r.z.size() ? r.z[res.z.size() + 2] : 0;
                int d2 = res.z.size() + 1 < r.z.size() ? r.z[res.z.size() + 1] : 0;
                int d3 = res.z.size() < r.z.size() ? r.z[res.z.size()] : 0;
                q = (int)(((long long)d1 * base * base + (long long)d2 * base + d3) / (firstDigit * 2));
            }
        }

        res.trim();
        return res / norm;
    }

    bigint operator/(const bigint &v) const { return divmod(*this, v).first; }

    bigint operator%(const bigint &v) const { return divmod(*this, v).second; }

    bigint &operator/=(int v) {
        if (v < 0)
            sign = -sign, v = -v;
        for (int i = (int)z.size() - 1, rem = 0; i >= 0; --i) {
            long long cur = z[i] + rem * (long long)base;
            z[i] = (int)(cur / v);
            rem = (int)(cur % v);
        }
        trim();
        return *this;
    }

    bigint operator/(int v) const { return bigint(*this) /= v; }

    int operator%(int v) const {
        if (v < 0)
            v = -v;
        int m = 0;
        for (int i = (int)z.size() - 1; i >= 0; --i)
            m = (int)((z[i] + m * (long long)base) % v);
        return m * sign;
    }

    bigint &operator*=(const bigint &v) {
        *this = *this * v;
        return *this;
    }

    bigint &operator/=(const bigint &v) {
        *this = *this / v;
        return *this;
    }

    bigint &operator%=(const bigint &v) {
        *this = *this % v;
        return *this;
    }

    bool operator<(const bigint &v) const {
        if (sign != v.sign)
            return sign < v.sign;
        if (z.size() != v.z.size())
            return z.size() * sign < v.z.size() * v.sign;
        for (int i = (int)z.size() - 1; i >= 0; i--)
            if (z[i] != v.z[i])
                return z[i] * sign < v.z[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 sign == v.sign && z == v.z; }

    bool operator!=(const bigint &v) const { return !(*this == v); }

    void trim() {
        while (!z.empty() && z.back() == 0)
            z.pop_back();
        if (z.empty())
            sign = 1;
    }

    bool isZero() const { return z.empty(); }

    friend bigint operator-(bigint v) {
        if (!v.z.empty())
            v.sign = -v.sign;
        return v;
    }

    bigint abs() const { return sign == 1 ? *this : -*this; }

    long long longValue() const {
        long long res = 0;
        for (int i = (int)z.size() - 1; i >= 0; i--)
            res = res * base + z[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;
        z.clear();
        int pos = 0;
        while (pos < s.size() && (s[pos] == '-' || s[pos] == '+')) {
            if (s[pos] == '-')
                sign = -sign;
            ++pos;
        }
        for (int i = (int)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';
            z.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.z.empty() ? 0 : v.z.back());
        for (int i = (int)v.z.size() - 2; i >= 0; --i)
            stream << setw(base_digits) << setfill('0') << v.z[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 < p.size(); i++)
            p[i] = p[i - 1] * 10;
        vector<int> res;
        long long cur = 0;
        int cur_digits = 0;
        for (int v : a) {
            cur += v * 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() == 0)
            res.pop_back();
        return res;
    }

    bigint operator*(const bigint &v) const {
        if (min(z.size(), v.z.size()) < 150)
            return mul_simple(v);
        bigint res;
        res.sign = sign * v.sign;
        res.z = multiply_bigint(convert_base(z, base_digits, fft_base_digits),
                                convert_base(v.z, base_digits, fft_base_digits), fft_base);
        res.z = convert_base(res.z, fft_base_digits, base_digits);
        res.trim();
        return res;
    }

    bigint mul_simple(const bigint &v) const {
        bigint res;
        res.sign = sign * v.sign;
        res.z.resize(z.size() + v.z.size());
        for (int i = 0; i < z.size(); ++i)
            if (z[i])
                for (int j = 0, carry = 0; j < v.z.size() || carry; ++j) {
                    long long cur = res.z[i + j] + (long long)z[i] * (j < v.z.size() ? v.z[j] : 0) + carry;
                    carry = (int)(cur / base);
                    res.z[i + j] = (int)(cur % base);
                }
        res.trim();
        return res;
    }
};

mt19937 rng(1);

bigint random_bigint(int n) {
    string s;
    for (int i = 0; i < n; i++) {
        s += uniform_int_distribution<int>('0', '9')(rng);
    }
    return bigint(s);
}

namespace {
	using namespace std;

	bool is_prime(int p){
		for(int q = 2; q * q <= p; q++){
			if(p % q == 0) return false;
		}
		return true;
	}

	string my_solve(int N){
		double log_prime_powers = 0;
		int M = 700;

		bigint res = 0;
		bigint mod = 1;
		for(int p = 2; p <= M; p++){
			// if p is prime, multiply log_prime_powers by p^k where p^k <= M
			if(is_prime(p)){
				int q = 1;
				while(q * p <= M) q *= p;
				log_prime_powers += log(q) / log(2);
				
				vector<int> A(q);
				vector<int> B(q);
				for(int i = 0; i < q; i++){
					A[i] = (2*i) % q;
					B[i] = (2*i+1) % q;
				}
				int val = Query(q, A, B);
				while(res % q != val) res += mod;
				mod *= q;
			}
		}
		string ans;
		for(int i = 0; i < N; i++){
			if(res % 2 == 0) ans += '0';
			else ans += '1';
			res /= 2;
		}
		reverse(ans.begin(), ans.end());
		return ans;
	}

}  // namespace

std::string Solve(int N) {
	return my_solve(N);
}

Compilation message

ancient2.cpp: In function 'void fft(std::vector<std::complex<double> >&, bool)':
ancient2.cpp:28:35: warning: comparison of integer expressions of different signedness: 'unsigned int' and 'int' [-Wsign-compare]
   28 |     for (unsigned i = 1, j = 0; i < n; i++) {
      |                                 ~~^~~
ancient2.cpp:30:18: warning: comparison of integer expressions of different signedness: 'unsigned int' and 'int' [-Wsign-compare]
   30 |         for (; j >= bit; bit >>= 1)
      |                ~~^~~~~~
ancient2.cpp: In function 'std::vector<int> multiply_bigint(const std::vector<int>&, const std::vector<int>&, int)':
ancient2.cpp:58:26: warning: comparison of integer expressions of different signedness: 'size_t' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   58 |     for (size_t i = 0; i < n; i++) {
      |                        ~~^~~
ancient2.cpp: In member function 'bigint& bigint::operator+=(const bigint&)':
ancient2.cpp:156:42: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  156 |             for (int i = 0, carry = 0; i < other.z.size() || carry; ++i) {
      |                                        ~~^~~~~~~~~~~~~~~~
ancient2.cpp:157:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  157 |                 if (i == z.size())
      |                     ~~^~~~~~~~~~~
ancient2.cpp:159:36: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  159 |                 z[i] += carry + (i < other.z.size() ? other.z[i] : 0);
      |                                  ~~^~~~~~~~~~~~~~~~
ancient2.cpp: In member function 'bigint& bigint::operator-=(const bigint&)':
ancient2.cpp:178:46: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  178 |                 for (int i = 0, carry = 0; i < other.z.size() || carry; ++i) {
      |                                            ~~^~~~~~~~~~~~~~~~
ancient2.cpp:179:40: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  179 |                     z[i] -= carry + (i < other.z.size() ? other.z[i] : 0);
      |                                      ~~^~~~~~~~~~~~~~~~
ancient2.cpp: In member function 'bigint& bigint::operator*=(int)':
ancient2.cpp:203:38: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  203 |         for (int i = 0, carry = 0; i < z.size() || carry; ++i) {
      |                                    ~~^~~~~~~~~~
ancient2.cpp:204:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  204 |             if (i == z.size())
      |                 ~~^~~~~~~~~~~
ancient2.cpp: In member function 'void bigint::read(const string&)':
ancient2.cpp:380:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  380 |         while (pos < s.size() && (s[pos] == '-' || s[pos] == '+')) {
      |                ~~~~^~~~~~~~~~
ancient2.cpp: In static member function 'static std::vector<int> bigint::convert_base(const std::vector<int>&, int, int)':
ancient2.cpp:413:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  413 |         for (int i = 1; i < p.size(); i++)
      |                         ~~^~~~~~~~~~
ancient2.cpp: In member function 'bigint bigint::mul_simple(const bigint&) const':
ancient2.cpp:449:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  449 |         for (int i = 0; i < z.size(); ++i)
      |                         ~~^~~~~~~~~~
ancient2.cpp:451:46: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  451 |                 for (int j = 0, carry = 0; j < v.z.size() || carry; ++j) {
      |                                            ~~^~~~~~~~~~~~
ancient2.cpp:452:73: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  452 |                     long long cur = res.z[i + j] + (long long)z[i] * (j < v.z.size() ? v.z[j] : 0) + carry;
      |                                                                       ~~^~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Partially correct 10 ms 344 KB Output is partially correct
2 Partially correct 13 ms 344 KB Output is partially correct
3 Partially correct 9 ms 1032 KB Output is partially correct
4 Partially correct 11 ms 704 KB Output is partially correct
5 Partially correct 10 ms 536 KB Output is partially correct
6 Partially correct 6 ms 344 KB Output is partially correct
7 Partially correct 11 ms 344 KB Output is partially correct
8 Partially correct 8 ms 344 KB Output is partially correct
9 Partially correct 8 ms 344 KB Output is partially correct
10 Partially correct 8 ms 344 KB Output is partially correct
11 Partially correct 5 ms 532 KB Output is partially correct
12 Partially correct 12 ms 600 KB Output is partially correct
13 Partially correct 10 ms 344 KB Output is partially correct
14 Partially correct 10 ms 344 KB Output is partially correct
15 Partially correct 7 ms 344 KB Output is partially correct
16 Partially correct 11 ms 540 KB Output is partially correct
17 Partially correct 8 ms 344 KB Output is partially correct
18 Partially correct 13 ms 340 KB Output is partially correct
19 Partially correct 8 ms 528 KB Output is partially correct
20 Partially correct 8 ms 344 KB Output is partially correct
21 Partially correct 8 ms 344 KB Output is partially correct
22 Partially correct 13 ms 344 KB Output is partially correct
23 Partially correct 10 ms 344 KB Output is partially correct
24 Partially correct 10 ms 344 KB Output is partially correct
25 Partially correct 10 ms 600 KB Output is partially correct
26 Partially correct 8 ms 340 KB Output is partially correct
27 Partially correct 11 ms 340 KB Output is partially correct
28 Partially correct 9 ms 540 KB Output is partially correct
29 Partially correct 12 ms 532 KB Output is partially correct
30 Partially correct 11 ms 528 KB Output is partially correct
31 Partially correct 11 ms 344 KB Output is partially correct
32 Partially correct 9 ms 536 KB Output is partially correct
33 Partially correct 9 ms 540 KB Output is partially correct
34 Partially correct 11 ms 344 KB Output is partially correct
35 Partially correct 10 ms 600 KB Output is partially correct
36 Partially correct 12 ms 344 KB Output is partially correct
37 Partially correct 11 ms 448 KB Output is partially correct
38 Partially correct 8 ms 344 KB Output is partially correct
39 Partially correct 8 ms 344 KB Output is partially correct
40 Partially correct 9 ms 532 KB Output is partially correct
41 Partially correct 11 ms 520 KB Output is partially correct
42 Partially correct 9 ms 344 KB Output is partially correct
43 Partially correct 10 ms 540 KB Output is partially correct
44 Partially correct 13 ms 344 KB Output is partially correct
45 Partially correct 13 ms 344 KB Output is partially correct
46 Partially correct 9 ms 344 KB Output is partially correct
47 Partially correct 10 ms 600 KB Output is partially correct
48 Partially correct 8 ms 344 KB Output is partially correct
49 Partially correct 8 ms 344 KB Output is partially correct
50 Partially correct 11 ms 344 KB Output is partially correct
51 Partially correct 8 ms 484 KB Output is partially correct
52 Partially correct 9 ms 344 KB Output is partially correct
53 Partially correct 8 ms 724 KB Output is partially correct
54 Partially correct 8 ms 508 KB Output is partially correct
55 Partially correct 8 ms 344 KB Output is partially correct
56 Partially correct 9 ms 548 KB Output is partially correct
57 Partially correct 9 ms 468 KB Output is partially correct
58 Partially correct 10 ms 788 KB Output is partially correct
59 Partially correct 8 ms 344 KB Output is partially correct
60 Partially correct 11 ms 532 KB Output is partially correct
61 Partially correct 8 ms 344 KB Output is partially correct
62 Partially correct 8 ms 344 KB Output is partially correct
63 Partially correct 9 ms 540 KB Output is partially correct