QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#225191 | #6399. Classic: Classical Problem | YouKn0wWho | WA | 0ms | 4004kb | C++23 | 4.0kb | 2023-10-24 04:45:03 | 2023-10-24 04:45:04 |
Judging History
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; res.push_back(0);
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: 0ms
memory: 4004kb
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: 0ms
memory: 3660kb
input:
3 1 2 0 1 2 1 2 2 1 0
output:
1 1 0 1 1 0 1 1 0
result:
wrong answer 1st lines differ - expected: '2 1', found: '1 1'