QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#879643#9699. Loving You in My Humble Wayhos_lyricAC ✓10ms4892kbC++142.3kb2025-02-02 09:43:032025-02-02 09:43:03

Judging History

This is the latest submission verdict.

  • [2025-02-02 09:43:03]
  • Judged
  • Verdict: AC
  • Time: 10ms
  • Memory: 4892kb
  • [2025-02-02 09:43:03]
  • Submitted

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")


constexpr int P = 43;

int N;
int ids[P][P][P];
vector<int> X, Y, Z;
bitset<P*P> adj[P*P];

int main() {
  memset(ids, ~0, sizeof(ids));
  for (int x = 0; x < P; ++x) for (int y = 0; y < P; ++y) for (int z = 0; z < P; ++z) if ((x*x + y*y + z*z) % P != 0) {
    if (z == 1 || (y == 1 && z == 0) || (x == 1 && y == 0 && z == 0)) {
      ids[x][y][z] = N++;
      X.push_back(x);
      Y.push_back(y);
      Z.push_back(z);
    }
  }
  cerr << "N = " << N << endl;
  assert(N == P*P);
  
  for (int u = 0; u < N; ++u) for (int v = u + 1; v < N; ++v) {
    if ((X[u]*X[v] + Y[u]*Y[v] + Z[u]*Z[v]) % P == 0) {
      adj[u].set(v);
      adj[v].set(u);
    }
  }
  
  vector<vector<int>> ans;
  for (int u = 0; u < N; ++u) for (int v = u + 1; v < N; ++v) if (adj[u][v]) {
    const auto both = adj[u] & adj[v];
    for (int w = both._Find_next(v); w < N; w = both._Find_next(w)) {
      ans.push_back({u, v, w});
    }
  }
  printf("%d\n", (int)ans.size());
  for (const auto &t : ans) {
    printf("%d %d %d\n", t[0] + 1, t[1] + 1, t[2] + 1);
  }
  
  return 0;
}

这程序好像有点Bug,我给组数据试试?

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 10ms
memory: 4892kb

input:

<no-input>

output:

13244
1 2 45
1 47 1809
1 89 907
1 131 605
1 175 1381
1 219 735
1 261 303
1 345 693
1 387 821
1 429 1293
1 473 1679
1 517 1077
1 561 1425
1 649 863
1 777 1337
1 949 1767
1 991 1205
1 1035 1469
1 1121 1637
1 1163 1511
1 1249 1723
1 1553 1595
2 46 1808
2 88 906
2 130 604
2 174 1380
2 218 734
2 260 302
...

result:

ok Correct!

Extra Test:

score: 0
Extra Test Passed