QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#210911#3840. Pass the Ball!linninsWA 1ms5392kbC++203.5kb2023-10-11 21:23:142023-10-11 21:23:15

Judging History

This is the latest submission verdict.

  • [2023-10-11 21:23:15]
  • Judged
  • Verdict: WA
  • Time: 1ms
  • Memory: 5392kb
  • [2023-10-11 21:23:14]
  • Submitted

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(1);
		//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
Wrong Answer
time: 1ms
memory: 5392kb

input:

4 4
2 4 1 3
1
2
3
4

output:

1
1
1
1

result:

wrong answer 1st lines differ - expected: '25', found: '1'