QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#140649#6399. Classic: Classical ProblemSchi2oidWA 18ms83548kbC++142.7kb2023-08-16 15:31:392023-08-16 15:31:48

Judging History

你现在查看的是最新测评结果

  • [2023-08-16 15:31:48]
  • 评测
  • 测评结果:WA
  • 用时:18ms
  • 内存:83548kb
  • [2023-08-16 15:31:39]
  • 提交

answer

#include<bits/stdc++.h>
#define int long long
using namespace std;
const long double pi=acos(-1);
struct CP{
	long double x,y;
	CP(long double X=0,long double Y=0) {x=X,y=Y;}
	CP operator + (const CP& ano) const { return (CP){x+ano.x,y+ano.y}; }
	CP operator - (const CP& ano) const { return (CP){x-ano.x,y-ano.y}; }
	CP operator * (const CP& ano) const { return (CP){x*ano.x-y*ano.y,x*ano.y+y*ano.x}; }
};
int n;
int id[800005];
void get_id(){for(int i=1;i<n;i++) id[i]=(id[i>>1]>>1)^((n>>1)*(i&1));}
CP F[800005],G[800005],ret[800005];
void FFT(CP *A,bool op){
	get_id();
	for(int i=0;i<n;i++) if(id[i]<i) swap(A[id[i]],A[i]);
	for(int i=2;i<=n;i<<=1){
		CP T_SPIN=CP(cos(2*pi/i),sin(2*pi/i));
		if(op) T_SPIN.y=-T_SPIN.y;
		for(int j=0;j<n;j+=i){
			CP BTB=CP(1,0);
			for(int k=j;k<j+i/2;k++){
				CP fl=A[k];
				A[k]=fl+BTB*A[k+i/2];
				A[k+i/2]=fl-BTB*A[k+i/2];
				BTB=BTB*T_SPIN;
			}
		}
	}
	if(op) for(int i=0;i<n;i++) A[i].x=(int)(A[i].x/n+0.5),A[i].y=0;
}
vector<int>fac;
int qkp(int x,int k,int p){
	int ret=1;
	while(k){
		if(k&1) ret=ret*x%p;
		x=x*x%p;
		k>>=1;
	}
	return ret;
}
int I[800005];
int a[800005];
vector<int>ans;
signed main(){
	int t,sz,p;
	cin>>t;
	while(t--){
		scanf("%lld%lld",&sz,&p);
		n=1;
		while(n<=p) n<<=1;
		n<<=1;
		fac.clear();
		for(int i=2;i<=sqrt(p-1);i++) if((p-1)%i==0) fac.push_back(i),fac.push_back((p-1)/i);
		int g=0;
		for(int i=2;i<p;i++){
			int ok=1;
			for(int j=0;j<fac.size();j++){
				if(qkp(i,fac[j],p)==1){ok=0;break;}
			}
			if(ok){
				g=i;
				break;
			}
		}
		I[1]=0;
		int tmp=1;
		for(int i=1;i<p-1;i++){
			tmp=tmp*g%p;
			I[tmp]=i;
		}
		int ok=0;
		for(int i=1;i<=sz;i++){
			scanf("%lld",&a[i]);
			if(a[i]==0) ok=1;
		}
		if(!ok){
			printf("1 1\n0\n");
			continue;
		}
		sort(a+1,a+1+sz);
		for(int i=2;i<=sz;i++) a[i]=I[a[i]];
		for(int i=0;i<n;i++) F[i]=CP(0,0);
		for(int i=2;i<=sz;i++) F[a[i]]=CP(1,0);
		FFT(F,0);
		int l=1,r=p;
		while(l<r){
			int mid=l+r+1>>1;
			for(int i=0;i<n;i++) G[i]=CP(0,0);
			for(int i=1;i<mid;i++) G[p-1-I[i]]=CP(1,0);
			FFT(G,0);
			for(int i=0;i<n;i++) ret[i]=G[i]*F[i];
			FFT(ret,1);
			int ok=0;
			for(int i=0;i<p-1;i++){
				if(ret[i].x+ret[i+p-1].x==mid-1){
					ok=1;
					break;
				}
			}
			if(ok) l=mid;
			else r=mid-1;
		}
		ans.clear();
		for(int i=0;i<n;i++) G[i]=CP(0,0);
		for(int i=1;i<r;i++) G[p-1-I[i]]=CP(1,0);
		FFT(G,0);
		for(int i=0;i<n;i++) ret[i]=G[i]*F[i];
		FFT(ret,1);
		for(int i=0;i<p-1;i++) if(ret[i].x+ret[i+p-1].x==r-1) ans.push_back(qkp(g,p-1-i,p));
		printf("%lld %lld\n",ans.size(),r);
		sort(ans.begin(),ans.end());
		for(int i=0;i<ans.size();i++) printf("%lld ",ans[i]);
		puts("");
	}
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 18ms
memory: 81732kb

input:

3
2 3
0 2
3 5
2 3 4
3 5
0 2 3

output:

1 2
2 
1 1
0
2 2
2 3 

result:

ok 6 lines

Test #2:

score: -100
Wrong Answer
time: 16ms
memory: 83548kb

input:

3
1 2
0
1 2
1
2 2
1 0

output:

1 1
0 
1 1
0
1 2
0 

result:

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