QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#828849 | #3840. Pass the Ball! | yumingsk | WA | 1ms | 7924kb | C++20 | 3.1kb | 2024-12-23 21:20:24 | 2024-12-23 21:20:24 |
Judging History
answer
#include <bits/stdc++.h>
#define int long long
using namespace std;
// constexpr int N = 11, G = 3, Gi = 332748118, mod = 998244353;
#define int long long
const int N = 1e6 + 10;
int rev[N << 2], A[N << 2], B[N << 2], Inv;
const int mod = 4179340454199820289, G = 3, Gi = 1393113484733273430;
constexpr int ksm(int a, int b, const int &p = mod, int c = 1)
{
for (a %= p; b; a = (__int128_t)a * a % p, b >>= 1)
if (b & 1)
c = (__int128_t)c * a % p;
return c;
}
int prelim(int n)
{
int bit = __lg(n) + 1, lim = 1ll << bit;
for (int i = 0; i < lim; ++i)
rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (bit - 1));
return Inv = ksm(lim, mod - 2), lim;
}
void NTT(int *a, int n, int tp)
{
for (int i = 0; i < n; ++i)
if (i < rev[i])
swap(a[i], a[rev[i]]);
for (int k = 1; k < n; k <<= 1)
{
int w = ksm(tp == 1 ? G : Gi, (mod - 1) / (k << 1));
for (int i = 0; i < n; i += (k << 1))
{
int e = 1;
for (int j = 0; j < k; e = (__int128_t)e * w % mod, ++j)
{
int u = a[i + j], v = (__int128_t)e * a[i + j + k] % mod;
a[i + j] = (u + v) % mod, a[i + j + k] = (u - v + mod) % mod;
}
}
}
if (tp == -1)
for (int i = 0; i < n; ++i)
a[i] = (__int128_t)a[i] * Inv % mod;
}
const int sq = 390;
int c[sq + 10][sq + 10];
signed main()
{
int n, m;
cin >> n >> m;
vector<int> p(n + 1);
vector<int> q(m + 1);
for (int i = 1; i <= n; i++)
cin >> p[i];
for (int i = 1; i <= m; i++)
cin >> q[i];
vector<int> vis(n + 1, 0);
vector<int> ans(n + 1, 0);
// for (int i = 1; i <= sq; i++)
// {
// for (int j = 1; j <= sq; j++)
// {
// cout << c[i][j] << '\n';
// }
// }
for (int i = 1; i <= n; i++)
{
if (!vis[i])
{
int cnt = 0;
for (int j = i; !vis[j]; j = p[j])
{
vis[j] = 1;
A[cnt] = B[cnt] = j;
cnt++;
}
reverse(B, B + cnt);
for (int j = 0; j < cnt; j++)
B[j + cnt] = B[j];
int lim = prelim(3 * cnt + 1);
// cout << lim << '\n';
for (int j = cnt; j < lim; j++)
A[j] = 0;
for (int j = cnt + cnt; j < lim; j++)
B[j] = 0;
NTT(A, lim, 1);
NTT(B, lim, 1);
for (int j = 0; j < lim; j++)
A[j] = (__int128_t)A[j] * B[j] % mod;
NTT(A, lim, -1);
if (cnt >= sq)
{
for (int j = 1; j <= m; j++)
ans[j] += A[q[j] % cnt + cnt - 1];
}
else
{
for (int j = 0; j < cnt; j++)
c[cnt][j] += A[j + cnt - 1];
}
}
}
for (int i = 1; i <= m; i++)
{
for (int j = 2; j <= sq; j++)
ans[i] += c[j][q[i] % j];
cout << ans[i] << "\n";
}
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 1ms
memory: 7632kb
input:
4 4 2 4 1 3 1 2 3 4
output:
25 20 25 30
result:
ok 4 lines
Test #2:
score: -100
Wrong Answer
time: 1ms
memory: 7924kb
input:
3 6 2 3 1 1 2 3 999999998 999999999 1000000000
output:
<1 11 14 11 4127 3760798370223501628
result:
wrong answer 1st lines differ - expected: '11', found: '<1'