QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#210910 | #3840. Pass the Ball! | linnins | RE | 0ms | 0kb | C++20 | 3.5kb | 2023-10-11 21:22:22 | 2023-10-11 21:22:23 |
Judging History
answer
#include<cstdio>
#include<vector>
#include<iostream>
#define int __int128
using namespace std;
const int modp = 4179340454199820289;
const int g = 3;
const int gny = 1393113484733273430;
int pos[1000500 + 1000];
int Map[1000500];
int n,m;
int flag;
int check[1000500];
int maxlen, maxbit, inv;
vector< vector<int> > Vec;
vector< vector<int> > Vec2;
vector< int > Size;
int read_int()
{
bool flag = 0;
char c;
int x = 0;
while(((c = getchar()) < '0' || c > '9') && c != '-');
if(c == '-')
flag = 1;
else
x = c - '0';
while((c = getchar()) >= '0' && c <= '9')
x = x * 10 + c - '0';
if(flag)
return -x;
else
return x;
}
void print_int(int x)
{
if (x < 0)
{
putchar('-');
x = -x;
}
if (x > 9)
print_int(x / 10);
putchar(x % 10 + '0');
}
void Swap(int &a,int &b){
int c;
c = a;
a = b;
b = c;
}
void Make_Ring(int t);
int Cal(int p);
void NTT(vector<int> &A,vector<int> &B);
int Cal_Ring(int t,int p);
int pow_k(int a, int b);
void ntt(vector<int> &A, bool flag);
signed main()
{
n = read_int();
m = read_int();
for(int i=1;i<=n;i++){
int next;
next = read_int();
Map[i] = next;
}
for(int i=1;i<=n;i++){
if(check[i] == 0){
//Make_Ring(i);//通过flag来表示前方有几个环
}
}
flag = Vec.size();
for(int i=0;i<flag;i++){
vector<int> Mid;
int p = Vec[i].size();
for(int j=0;j<=p;j++)
Mid.push_back(0);
for(int j=p+1;j<=p*2;j++)
Mid.push_back(Vec[i][p*2-j]);
Vec2.push_back(Mid);
}
//for(int i=0;i<flag;i++)
//NTT(Vec2[i],Vec[i]);
for(int i=1;i<=m;i++){
int p;
p = read_int();
print_int(Cal(p));
putchar('\n');
}
return 0;
}
void Make_Ring(int t){
vector <int> Mid;
while(check[t] == 0){
Mid.push_back(t);
check[t] = 1;
t = Map[t];
}
Vec.push_back(Mid);
Size.push_back(Mid.size());
return;
}
void NTT(vector<int> &A,vector<int> &B){
int n = A.size() - 1;
int m = B.size() - 1;
maxlen = 1;
maxbit = 0;
while(maxlen <= n + m)
{
maxlen <<= 1;
++maxbit;
}
for(int i = A.size();i<=maxlen;i++){
A.push_back(0);
}
for(int i = B.size();i<=maxlen;i++){
B.push_back(0);
}
inv = pow_k(maxlen, modp - 2);
for(int i = 1; i < maxlen; ++i)
{
pos[i] = ((pos[(i >> 1)] >> 1) | ((i & 1) << (maxbit - 1)));
}
ntt(A, 1);
ntt(B, 1);
for(int i = 0; i < maxlen; ++i)
{
A[i] = A[i] * B[i] % modp;
}
ntt(A, 0);
for(int i = 0; i < n + m + 1; ++i)
{
A[i] = A[i] * inv % modp;
}
}
int Cal(int p){
int Ans = 0;
for(int i=0;i<Vec.size();i++){
Ans += Cal_Ring(i,p);
}
}
int Cal_Ring(int t,int p){
int n = Size[t];
p = p%n;
return Vec2[t][p+2*n] + Vec2[t][p+n];
}
int pow_k(int a, int b)
{
int ans = 1;
while(b > 0)
{
if(b & 1)
ans = ans * a % modp;
a = a * a % modp;
b = (b >> 1);
}
return ans;
}
void ntt(vector<int> &A, bool flag)
{
for(int i = 1; i < maxlen; ++i)
{
if(i < pos[i]) Swap(A[pos[i]], A[i]);
}
for(int len = 1; len < maxlen; len <<= 1)
{
int wn = pow_k(flag ? g : gny, (modp - 1) / (len << 1));
for(int i = 0; i < maxlen; i += (len << 1))
{
int w = 1;
for(int j = 0; j < len; ++j)
{
int temp1 = A[i + j], temp2 = w * A[i + j + len] % modp;
A[i + j] = (temp1 + temp2) % modp;
A[i + j + len] = ((temp1 - temp2) % modp + modp) % modp;
w = w * wn % modp;
}
}
}
return ;
}
/*
4 4
2 4 1 3
1
2
3
4
*/
详细
Test #1:
score: 0
Runtime Error
input:
4 4 2 4 1 3 1 2 3 4