QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#225192#6399. Classic: Classical ProblemYouKn0wWhoWA 1ms3752kbC++234.0kb2023-10-24 04:46:372023-10-24 04:46:38

Judging History

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

  • [2023-10-24 04:46:38]
  • 评测
  • 测评结果:WA
  • 用时:1ms
  • 内存:3752kb
  • [2023-10-24 04:46:37]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;

const int N = 2e5 + 9;

const double PI = acos(-1);
struct base {
  double a, b;
  base(double a = 0, double b = 0) : a(a), b(b) {}
  const base operator + (const base &c) const
    { return base(a + c.a, b + c.b); }
  const base operator - (const base &c) const
    { return base(a - c.a, b - c.b); }
  const base operator * (const base &c) const
    { return base(a * c.a - b * c.b, a * c.b + b * c.a); }
};
void fft(vector<base> &p, bool inv = 0) {
  int n = p.size(), i = 0;
  for(int j = 1; j < n - 1; ++j) {
    for(int k = n >> 1; k > (i ^= k); k >>= 1);
    if(j < i) swap(p[i], p[j]);
  }
  for(int l = 1, m; (m = l << 1) <= n; l <<= 1) {
    double ang = 2 * PI / m;
    base wn = base(cos(ang), (inv ? 1. : -1.) * sin(ang)), w;
    for(int i = 0, j, k; i < n; i += m) {
      for(w = base(1, 0), j = i, k = i + l; j < k; ++j, w = w * wn) {
        base t = w * p[j + l];
        p[j + l] = p[j] - t;
        p[j] = p[j] + t;
      }
    }
  }
  if(inv) for(int i = 0; i < n; ++i) p[i].a /= n, p[i].b /= n;
}
vector<long long> multiply(vector<int> &a, vector<int> &b) {
  int n = a.size(), m = b.size(), t = n + m - 1, sz = 1;
  while(sz < t) sz <<= 1;
  vector<base> x(sz), y(sz), z(sz);
  for(int i = 0 ; i < sz; ++i) {
    x[i] = i < (int)a.size() ? base(a[i], 0) : base(0, 0);
    y[i] = i < (int)b.size() ? base(b[i], 0) : base(0, 0);
  }
  fft(x), fft(y);
  for(int i = 0; i < sz; ++i) z[i] = x[i] * y[i];
  fft(z, 1);
  vector<long long> ret(sz);
  for(int i = 0; i < sz; ++i) ret[i] = (long long) round(z[i].a);
  while((int)ret.size() > 1 && ret.back() == 0) ret.pop_back();
  return ret;
}
// ans[k] = sum(a[i] * b[j]) over 0 <= i < n and j - i = k
vector<long long> cyclic_convolution(vector<int> a, vector<int> b) {
  assert(a.size() == b.size());
  int n = a.size();
  b.resize(2 * n);
  for (int i = 0; i < n; i++) {
    b[i + n] = b[i];
  }
  reverse(a.begin(), a.end());
  auto c = multiply(b, a);
  vector<long long> ans(n, 0);
  c.resize(2 * n);
  for (int i = 0; i < n; i++) {
    ans[i] = c[n - 1 + i];
  }
  return ans;
}
int power(int a, int b, int m) {
  int res = 1;
  while (b > 0) {
    if (b & 1) res = 1LL * res * a % m;
    a = 1LL * a * a % m;
    b >>= 1;
  }
  return res;
}
int primitive_root(int p) {
  vector<int> fact;
  int phi = p - 1,  n = phi;
  for (int i = 2; i * i <= n; ++i) {
    if (n % i == 0) {
      fact.push_back(i);
      while (n % i == 0) n /= i;
    }
  }
  if (n > 1) fact.push_back(n);
  for (int res = 2; res <= p; ++res) {
    bool ok = true;
    for (size_t i = 0; i < fact.size() && ok; ++i)
      ok &= power(res, phi / fact[i], p) != 1;
    if (ok)  return res;
  }
  return -1;
}
int32_t main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  int t; cin >> t;
  while (t--) {
    int n, p; cin >> n >> p;
    vector<int> a(n + 1);
    bool z = false;
    for (int i = 1; i <= n; i++) {
      cin >> a[i];
      z |= a[i] == 0;
    }
    if (!z) {
      cout << 1 << ' ' << 1 << '\n';
      cout << 0 << '\n';
      continue;
    }
    int g = primitive_root(p);
    int x = 1;
    vector<int> f(p), rev(p);
    f[1] = 0; rev[0] = 1;
    for (int i = 1; i < p - 1; i++) {
      x = 1LL * x * g % p;
      f[x] = i;
      rev[i] = x;
    }
    int l = 2, r = p, ans = 1;
    vector<int> res;
    for (int i = 0; i < p; i++) {
      res.push_back(i);
    }
    while (l <= r) {
      int mid = l + r >> 1;
      vector<int> u(p - 1, 0), v(p - 1, 0);
      for (int i = 1; i < mid; i++) {
        u[f[i]] = 1;
      }
      for (int i = 1; i <= n; i++) {
        if (a[i]) {
          v[f[a[i]]] = 1;
        }
      }
      auto w = cyclic_convolution(v, u);
      vector<int> cur;
      for (int i = 1; i < p - 1; i++) {
        if (w[i] == mid - 1) {
          cur.push_back(rev[i]);
        }
      }
      if (!cur.empty()) {
        ans = mid;
        res = cur;
        l = mid + 1;
      }
      else {
        r = mid - 1;
      }
    }
    sort(res.begin(), res.end());
    cout << res.size() << ' ' << ans << '\n';
    for (auto x: res) cout << x << ' ';
    cout << '\n';
  }
  return 0;
}

详细

Test #1:

score: 100
Accepted
time: 1ms
memory: 3752kb

input:

3
2 3
0 2
3 5
2 3 4
3 5
0 2 3

output:

1 2
2 
1 1
0
2 2
2 3 

result:

ok 6 lines

Test #2:

score: -100
Wrong Answer
time: 1ms
memory: 3480kb

input:

3
1 2
0
1 2
1
2 2
1 0

output:

2 1
0 1 
1 1
0
2 1
0 1 

result:

wrong answer 5th lines differ - expected: '1 2', found: '2 1'