QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#857419#9768. A + B = C Problemhos_lyricWA 0ms3840kbC++144.4kb2025-01-15 17:39:332025-01-15 17:39:35

Judging History

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

  • [2025-01-15 17:39:35]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:3840kb
  • [2025-01-15 17:39:33]
  • 提交

answer

#include <cassert>
#include <cmath>
#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <functional>
#include <iostream>
#include <limits>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <sstream>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <utility>
#include <vector>

using namespace std;

using Int = long long;

template <class T1, class T2> ostream &operator<<(ostream &os, const pair<T1, T2> &a) { return os << "(" << a.first << ", " << a.second << ")"; };
template <class T> ostream &operator<<(ostream &os, const vector<T> &as) { const int sz = as.size(); os << "["; for (int i = 0; i < sz; ++i) { if (i >= 256) { os << ", ..."; break; } if (i > 0) { os << ", "; } os << as[i]; } return os << "]"; }
template <class T> void pv(T a, T b) { for (T i = a; i != b; ++i) cerr << *i << " "; cerr << endl; }
template <class T> bool chmin(T &t, const T &f) { if (t > f) { t = f; return true; } return false; }
template <class T> bool chmax(T &t, const T &f) { if (t < f) { t = f; return true; } return false; }
#define COLOR(s) ("\x1b[" s "m")


#include <chrono>
#ifdef LOCAL
mt19937_64 rng(58);
#else
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
#endif


int Lcm(int a, int b) {
  return a / __gcd(a, b) * b;
}

void exper() {
  constexpr int N = 8;
  vector<string> S[N + 1];
  for (int n = 1; n <= N; ++n) {
    for (int p = 0; p < 1 << n; ++p) {
      string s(n, '?');
      for (int i = 0; i < n; ++i) s[i] = '0' + (p >> i & 1);
      if ([&]() -> bool {
        for (int m = 1; m < n; ++m) if (n % m == 0) {
          bool ok = true;
          for (int i = 0; i < n; ++i) ok = ok && (s[i % m] == s[i]);
          if (ok) return false;
        }
        return true;
      }()) S[n].push_back(s);
    }
cerr<<"|S[n]| = "<<S[n].size()<<endl;
  }
  for (int A = 1; A <= N; ++A) for (int B = 1; B <= N; ++B) for (int C = 1; C <= N; ++C) {
    const int L = Lcm(Lcm(A, B), C);
    const bool brt = [&]() -> bool {
      for (const string &sa : S[A]) for (const string &sb : S[B]) for (const string &sc : S[C]) {
        bool ok = true;
        for (int i = 0; i < L; ++i) if ((sa[i % A] - '0') ^ (sb[i % B] - '0') ^ (sc[i % C] - '0')) {
          ok = false;
          break;
        }
        if (ok) return true;
      }
      return false;
    }();
    if (A == 2 && B == 2 && C == 2) {
      assert(!brt);
    } else if (Lcm(B, C) % A == 0 && Lcm(C, A) % B == 0 && Lcm(A, B) % C == 0) {
      if (!brt) {
        cerr << "FAIL " << A << " " << B << " " << C << ": " << brt << endl;
      }
      assert(brt);
    } else {
      assert(!brt);
    }
  }
}

int main() {
  // exper();
  
  for (int numCases; ~scanf("%d", &numCases); ) { for (int caseId = 1; caseId <= numCases; ++caseId) {
    int N[3];
    for (int u = 0; u < 3; ++u) {
      scanf("%d", &N[u]);
    }
    
    int L[3];
    bool good = true;
    for (int u = 0; u < 3; ++u) {
      L[u] = Lcm(N[(u + 1) % 3], N[(u + 2) % 3]);
      good = good && (L[u] % N[u] == 0);
    }
    
    if (!(N[0] == 2 && N[1] == 2 && N[2] == 2) && good) {
      string ans[3];
      vector<int> fail[3];
      vector<int> rnd[3];
      for (int u = 0; u < 3; ++u) {
        ans[u].assign(N[u], '0');
        fail[u].assign(N[u] + 1, -1);
        rnd[u].assign(N[u], 0);
      }
      for (; ; ) {
        for (int u = 0; u < 3; ++u) {
          const int u1 = (u + 1) % 3;
          const int u2 = (u + 2) % 3;
          for (int i = 0; i < L[u]; ++i) {
            if (rng() & 1) {
              ans[u1][i % N[u1]] ^= 1;
              ans[u2][i % N[u2]] ^= 1;
            }
          }
        }
        bool ok = true;
        for (int u = 0; u < 3; ++u) {
          int j = -1;
          for (int i = 0; i < N[u]; ++i) {
            for (; ~j && ans[u][j] != ans[u][i]; j = fail[u][j]) {}
            fail[u][i + 1] = ++j;
          }
          int per = N[u] - fail[u][N[u]];
          if (N[u] % per != 0) per = N[u];
          if (per != N[u]) {
            ok = false;
            break;
          }
        }
        if (ok) break;
      }
      puts("YES");
      for (int u = 0; u < 3; ++u) {
        puts(ans[u].c_str());
      }
    } else {
      puts("NO");
    }
  }
#ifndef LOCAL
  break;
#endif
  }
  return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Wrong Answer
time: 0ms
memory: 3840kb

input:

2
2 3 6
2 3 5

output:

YES
10
100
101110
NO

result:

wrong answer Incorrect solution, A+B!=C (test case 1)