QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#642625#3840. Pass the Ball!laonongminRE 0ms0kbC++233.2kb2024-10-15 15:22:012024-10-15 15:22:03

Judging History

This is the latest submission verdict.

  • [2024-10-15 15:22:03]
  • Judged
  • Verdict: RE
  • Time: 0ms
  • Memory: 0kb
  • [2024-10-15 15:22:01]
  • Submitted

answer

#pragma GCC optimize(3)
#include <bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
#define N 200005
// #define MOD 998244353
using namespace std;
// #define int long long
struct Polynomial
{
    static const ll mod = 4179340454199820289LL; // 998244353LL
    vector<ll> z;
    vector<int> r;
    Polynomial(vector<ll> &a): z(a)
    {
        int n = z.size();
        for (int i=0; i<n; i++)
            r[i] = (i&1)*(n/2) + r[i/2]/2;
        ntt(z, n, 1);
    }
    ll power(ll a, ll b)
    {
        ll res = 1;
        for(; b; b>>=1, a = (__int128)a * a % mod)
            if(b&1) res = (__int128)res * a % mod;
        return res;
    }
    void ntt(vector<ll> &a, int n, int opt)
    {
        for(int i=0; i<n; i++)
            if (r[i]<i) swap(a[i], a[r[i]]);
        for(int k=2; k<=n; k*=2)
        {
            ll gn = power(3, (mod-1)/k);
            for(int i=0; i<n; i+=k)
            {
                ll g = 1;
                for(int j=0; j<k/2; j++, g = (__int128)g * gn % mod)
                {
                    ll t = (__int128)a[i+j+k/2] * g % mod;
                    a[i+j+k/2] = (a[i+j] + mod - t) % mod;
                    a[i+j] = (a[i+j] + t) % mod;
                }
            }
        }
        if (opt == -1)
        {
            reverse(a.begin()+1, a.end());
            ll inv = power(n, mod-2);
            for(int i=0; i<n; i++) a[i] = (__int128)a[i] * inv % mod;    
        }
    }
};

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<ll> 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<ll> 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);
        // for(int j=0;j<len;++j) cout<<A[j]<<' '; cout<<'\n';
        // for(int j=0;j<len;++j) cout<<B[j]<<' '; cout<<'\n';

        Polynomial FA(A), FB(B);
        for(int i=0;i<len;++i) FA.z[i] = (__int128)FA.z[i] * FB.z[i] % FA.mod;
        FA.ntt(FA.z, len, -1);

        // for(int j=0;j<len;++j) cout<<FA.c[j].x<<' '; cout<<'\n';
        
        if(F[tlen].empty()) 
        {
            F[tlen].resize(tlen);
            you.push_back(tlen);
        }
        // cout<<tlen<<"FFF\n";
        for(int j=0;j<tlen;++j)
        {
            F[tlen][j] += (FA.z[j]);
            if(j<tlen-1) F[tlen][j] += (FA.z[tlen-j-2]);
            // cout<<F[tlen][j]<<' ';
        }
        // cout<<'\n';
        // for(auto &&tlen:you) cout<<tlen<<'\n';
    }
    
    while(q--)
    {
        int k; cin>>k;
        ll ans = 0;
        for(auto &&tlen:you) {ans += F[tlen][(k+tlen-1)%tlen];}
        cout<<ans<<'\n';
    }
}
int 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;
    // cin>>T;
    while(T--)
    {
        solve();
    }
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Runtime Error

input:

4 4
2 4 1 3
1
2
3
4

output:


result: