QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#828849#3840. Pass the Ball!yumingskWA 1ms7924kbC++203.1kb2024-12-23 21:20:242024-12-23 21:20:24

Judging History

This is the latest submission verdict.

  • [2024-12-23 21:20:24]
  • Judged
  • Verdict: WA
  • Time: 1ms
  • Memory: 7924kb
  • [2024-12-23 21:20:24]
  • Submitted

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'