QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#639855 | #3840. Pass the Ball! | ruoye123456 | Compile Error | / | / | C++20 | 3.8kb | 2024-10-13 23:16:16 | 2024-10-13 23:16:18 |
Judging History
This is the latest submission verdict.
- [2024-10-13 23:16:18]
- Judged
- Verdict: Compile Error
- Time: 0ms
- Memory: 0kb
- [2024-10-13 23:16:16]
- Submitted
answer
#pragma GCC optimize(3)
#include <bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
#define N 300005
#define MOD1 998244353
#define MOD2 1004535809
#define G1 3
#define G2 3
using namespace std;
#define int long long
// 快速幂
int power(int a, int b, int mod) {
int res = 1;
while (b > 0) {
if (b & 1) res = res * a % mod;
a = a * a % mod;
b >>= 1;
}
return res;
}
// NTT 核心
void ntt(vector<int>& a, int n, int invert, int MOD, int G) {
for (int i = 1, j = 0; i < n; i++) {
int bit = n >> 1;
for (; j & bit; bit >>= 1) j ^= bit;
j ^= bit;
if (i < j) swap(a[i], a[j]);
}
for (int len = 2; len <= n; len <<= 1) {
int wlen = invert ? power(G, MOD - 1 - (MOD - 1) / len, MOD) : power(G, (MOD - 1) / len, MOD);
for (int i = 0; i < n; i += len) {
int w = 1;
for (int j = 0; j < len / 2; j++) {
int u = a[i + j], v = a[i + j + len / 2] * w % MOD;
a[i + j] = (u + v) % MOD;
a[i + j + len / 2] = (u - v + MOD) % MOD;
w = w * wlen % MOD;
}
}
}
if (invert) {
int inv_n = power(n, MOD - 2, MOD);
for (int& x : a) x = x * inv_n % MOD;
}
}
// 多模数 NTT 卷积,分别使用 MOD1 和 MOD2
vector<int> multiply(const vector<int>& a, const vector<int>& b, int MOD, int G) {
vector<int> fa(a.begin(), a.end()), fb(b.begin(), b.end());
int n = 1;
while (n < a.size() + b.size()) n <<= 1;
fa.resize(n);
fb.resize(n);
ntt(fa, n, 0, MOD, G);
ntt(fb, n, 0, MOD, G);
for (int i = 0; i < n; i++) fa[i] = fa[i] * fb[i] % MOD;
ntt(fa, n, 1, MOD, G);
return fa;
}
// 中国剩余定理 (CRT) 合并结果
int combine(int x1, int x2, int MOD1, int MOD2) {
int m1_inv_m2 = power(MOD1, MOD2 - 2, MOD2); // 求出 MOD1 在 MOD2 下的逆元
return (x1 + MOD1 * ((x2 - x1 + MOD2) % MOD2 * m1_inv_m2 % MOD2) % (MOD1 * MOD2)) % (MOD1 * MOD2);
}
vector<int> crt_multiply(const vector<int>& a, const vector<int>& b) {
vector<int> res1 = multiply(a, b, MOD1, G1);
vector<int> res2 = multiply(a, b, MOD2, G2);
vector<int> res(res1.size());
for (int i = 0; i < res.size(); i++) {
res[i] = combine(res1[i], res2[i], MOD1, MOD2);
}
return res;
}
int n, q;
int p[N];
int Log2[N];
bitset<N> vis;
vector<ll> F[N];
vector<int> you;
int cnt = 0;
void solve() {
cin >> n >> q;
for (int i = 1; i <= n; ++i) cin >> p[i];
for (int i = 1; i <= n; ++i) {
vector<int> A;
for (int u = i, j = 0;; ++j, u = p[u]) {
if (vis[u]) break;
vis[u] = 1;
A.push_back(u);
}
if (A.empty()) continue;
vector<int> B(A);
reverse(B.begin(), B.end());
int tlen = A.size();
int len = 1 << (Log2[2 * A.size() - 2] + 1); // 卷积所需的长度
A.resize(len);
B.resize(len);
vector<int> res = crt_multiply(A, B); // 使用CRT合并多模数结果
if (F[tlen].empty()) {
F[tlen].resize(tlen);
you.push_back(tlen);
}
for (int j = 0; j < tlen; ++j) {
F[tlen][j] += res[j];
if (j < tlen - 1) F[tlen][j] += res[tlen + j];
}
}
// 处理查询
while (q--) {
int k;
cin >> k;
ll ans = 0;
for (auto &&tlen : you) {
ans += F[tlen][(k + tlen - 1) % tlen];
}
cout << ans << '\n';
}
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
Log2[0] = -1;
for (int i = 1; i < N; ++i) Log2[i] = Log2[i / 2] + 1;
int T = 1;
while (T--) {
solve();
}
return 0;
}
詳細信息
answer.code:6:14: error: expected ‘,’ or ‘...’ before numeric constant 6 | #define MOD1 998244353 | ^~~~~~~~~ answer.code:68:33: note: in expansion of macro ‘MOD1’ 68 | int combine(int x1, int x2, int MOD1, int MOD2) { | ^~~~ answer.code: In function ‘long long int combine(long long int, long long int, long long int)’: answer.code:70:78: warning: integer overflow in expression of type ‘int’ results in ‘2002780161’ [-Woverflow] 70 | return (x1 + MOD1 * ((x2 - x1 + MOD2) % MOD2 * m1_inv_m2 % MOD2) % (MOD1 * MOD2)) % (MOD1 * MOD2); | ^ answer.code:70:95: warning: integer overflow in expression of type ‘int’ results in ‘2002780161’ [-Woverflow] 70 | return (x1 + MOD1 * ((x2 - x1 + MOD2) % MOD2 * m1_inv_m2 % MOD2) % (MOD1 * MOD2)) % (MOD1 * MOD2); | ^ answer.code: In function ‘std::vector<long long int> crt_multiply(const std::vector<long long int>&, const std::vector<long long int>&)’: answer.code:79:25: error: too many arguments to function ‘long long int combine(long long int, long long int, long long int)’ 79 | res[i] = combine(res1[i], res2[i], MOD1, MOD2); | ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ answer.code:68:5: note: declared here 68 | int combine(int x1, int x2, int MOD1, int MOD2) { | ^~~~~~~