QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#121459#5874. Mystery Squarewhatever41 ✓531ms3524kbC++172.6kb2023-07-08 10:30:202023-07-08 10:30:22

Judging History

你现在查看的是最新测评结果

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-07-08 10:30:22]
  • 评测
  • 测评结果:41
  • 用时:531ms
  • 内存:3524kb
  • [2023-07-08 10:30:20]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
mt19937_64 rnd(chrono::steady_clock::now().time_since_epoch().count());
int rng(int l, int r) { return rnd() % (r - l + 1) + l; }
#define rep(i, a, b) for (int i = (a), I = (b); i <= I; ++i)
#define per(i, a, b) for (int i = (a), I = (b); i >= I; --i)
using i64 = long long;
using i128 = __int128_t;
template<typename T> void up(T &x, T y) { if (x < y) x = y; }
template<typename T> void down(T &x, T y) { if (x > y) x = y; }

string s;
int n, m;
i128 ans;
i128 msk0, msk1, all;

bool match(int x, int y) {
    return s[x] == '?' || s[x] == '0' + y;
}
void check(i128 x) {
    x *= x;
    if ((x & msk0) || ((all ^ x) & msk1)) return;
    ans = x;
}
i128 get_sqr(i128 x) {
    return sqrt((long double) x);
}

void dfs(int pos, i128 cur) {
    if (~ans) return;
    if (pos == m - 1) {
        i128 p = get_sqr(cur);
        while (p * p < cur) ++p;
        while (((p * p) >> m) == (cur >> m)) check(p++);
        return;
    }
    if (match(pos, 0)) dfs(pos - 1, cur);
    if (match(pos, 1)) dfs(pos - 1, cur | i128(1) << pos);
}

void dfs(int pos, i128 cur, i128 sqr) {    
    if (~ans) return;
    if (pos == m) {
        check(sqr);
        check(sqr | i128(1) << (pos - 1));
        return;
    }
    int tmp = (sqr * sqr) >> pos & 1;
    rep(k, 0, 1) {
        int val = tmp + k + k * (pos == 2);
        if (match(pos, val & 1)) dfs(pos + 1, cur | i128(val & 1) << pos, sqr | i128(k) << (pos - 1));
    }
}

void solve() {
    n = s.size();
    m = (n + 1) / 2;
    int cnt_left = count(s.begin(), s.begin() + m, '?');
    int cnt_right = count(s.begin() + m, s.end(), '?');
    msk0 = msk1 = all = 0;
    rep(i, 0, n - 1) {
        all |= i128(1) << i; 
        if (s[i] == '?') continue;
        (s[i] == '0' ? msk0 : msk1) |= i128(1) << i;
    }

    if (cnt_left < cnt_right) {
        dfs(2, 1, 1);
    } else {
        dfs(n - 1, 0);
    }
}

int main() {
    ios::sync_with_stdio(0), cin.tie(0);

    int T;
    cin >> T;
    rep(t, 1, T) {
        cin >> s;
        reverse(s.begin(), s.end());
        ans = -1;
        for (int c = 0; ; c += 2) {
            if (match(0, 1)) { 
                s[0] = '1';
                solve();
                if (~ans) {
                    cout << "Case #" << t << ": ";
                    per(i, n - 1, 0) cout << int(ans >> i & 1);
                    rep(i, 0, c - 1) cout << 0;
                    cout << "\n";
                    break;
                }
            }
            s.erase(s.begin());
            s.erase(s.begin());
        }
    }

    return 0;
}

詳細信息

Subtask #1:

score: 10
Accepted

Test #1:

score: 10
Accepted
time: 1ms
memory: 3436kb

input:

25
1???
1
10??110??00??1000??
1??010?0110?1010?0?010?0111011?11100?100010?0??0??1
1??11????00??1?1?0?1??01??110110?11?00100110?00100?0?00
11?1?1???11111?11?1??11110000?00?????00??0?000?000?1
10??000000?0?00000?00000000??0?0000???00??????0000???
101???11??11000?????1??1?1??10??0?0100011?0001?01011001...

output:

Case #1: 1001
Case #2: 1
Case #3: 1011110110000100001
Case #4: 111010001100101000001010111011011100110001000110001
Case #5: 1101111110000101100101010111011001110010011000010000100
Case #6: 1111111111111111111111111000000000000000000000000001
Case #7: 1000000000000000000000000000000000000000000000000...

result:

ok 25 lines

Subtask #2:

score: 31
Accepted

Test #2:

score: 31
Accepted
time: 531ms
memory: 3524kb

input:

25
1????????????????????111101010000011100110101111000001011111100110000011000101100000010010110100101000????????????????????
10?11100?000111??11?01010110100??1?100111?001000000??0101?110?0111?011?11?1??00010111?010??100?100??10?010?001001110111110?1
1000100111100100110011010111100001111010?????????...

output:

Case #1: 11100101110101010110111110101000001110011010111100000101111110011000001100010110000001001011010010100001101011000010100001
Case #2: 1011110000001110111001010110100001110011100010000001101010110001111011111110000010111101010100010010101010100100111011111001
Case #3: 1000100111100100110011010...

result:

ok 25 lines

Extra Test:

score: 0
Extra Test Passed