QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#639855#3840. Pass the Ball!ruoye123456Compile Error//C++203.8kb2024-10-13 23:16:162024-10-13 23:16:18

Judging History

This is the latest submission verdict.

  • [2024-10-13 23:16:18]
  • Judged
  • [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) {
      |     ^~~~~~~