QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#642625 | #3840. Pass the Ball! | laonongmin | RE | 0ms | 0kb | C++23 | 3.2kb | 2024-10-15 15:22:01 | 2024-10-15 15:22:03 |
Judging History
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