QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#470489#6399. Classic: Classical ProblemUESTC_xxx#WA 1ms12076kbC++202.0kb2024-07-10 14:13:442024-07-10 14:13:44

Judging History

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

  • [2024-07-10 14:13:44]
  • 评测
  • 测评结果:WA
  • 用时:1ms
  • 内存:12076kb
  • [2024-07-10 14:13:44]
  • 提交

answer

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cmath>
#include<stack>
#include<vector>
#include<map>
#define ll long long
#define lowbit(x) x&(-x)
using namespace std;
int tt,n,t[500005],g[500005];
ll p,a[500005],m,b[500005],x[500005],y[500005];
ll Pow(ll x,ll y){
	ll z=1;
	while(y){
		if(y&1) z=(x*z)%p;
		x=(x*x)%p;
		y>>=1;
	}
	return z;
}
int main(){
	scanf("%d",&tt);
	while(tt--){
		m=0;
		scanf("%d%lld",&n,&p);
		for(int i=0;i<=p;++i) t[i]=g[i]=0;
		for(int i=1;i<=n;++i){
			scanf("%lld",&a[i]);
			x[i]=a[i];
			a[i]=Pow(a[i],p-2);
			t[a[i]]=g[a[i]]=1;
		}
		if(n==p){
			printf("%d %d\n",n-1,n+1);
			for(int i=1;i<=n-1;++i) printf("%d ",i);
			printf("\n");
			continue;
		}
		if(!t[0]){
			printf("1 1\n0\n");
			continue;
		}
		if(n==1){
			printf("%lld 1\n",p);
			for(int i=0;i<p;++i) printf("%d ",i);
			continue;
		}
		int f=0;
		for(ll i=2;i<min(1LL*301,p);++i){
			int ff=0;
			for(int j=1;j<=n;++j){
				if(a[j]==0) continue;
				if(t[(i*a[j])%p]==i-1) t[(i*a[j])%p]++,ff=1;
				else t[(i*a[j])%p]=0;
			}
			if(!ff){
				f=1;
				int cnt=0;
				for(int j=1;j<p;++j){
					if(g[j]==i-1) cnt++;
				}
				printf("%d %lld\n",cnt,i);
				for(int j=1;j<p;++j){
					if(g[j]==i-1) printf("%d ",j);
				}
				printf("\n");
				break;
			}
			for(int j=1;j<=n;++j){
				g[(i*a[j])%p]=t[(i*a[j])%p];
			}
		}
		if(f) continue;
		for(int j=1;j<p;++j){
			if(t[j]==300) m++,b[m]=j;
		}
		int ans=0,cnt=0;
		for(int i=1;i<=m;++i){
			for(int j=0;j<p;++j) t[j]=0;
			for(int j=1;j<=n;++j){
				t[b[i]*x[j]%p]++;
			}
			for(int j=0;j<=p;++j){
				if(!t[j]){
					ans=max(ans,j);
					break;
				}
			}
		}
		for(int i=1;i<=m;++i){
			for(int j=0;j<p;++j) t[j]=0;
			for(int j=1;j<=n;++j){
				t[b[i]*x[j]%p]++;
			}
			for(int j=0;j<=p;++j){
				if(!t[j]){
					if(j==ans) cnt++,y[cnt]=b[i];
					break;
				}
			}
		}
		printf("%d %d\n",cnt,ans);
		for(int i=1;i<=cnt;++i) printf("%lld ",y[i]);
		printf("\n");
	}
}

詳細信息

Test #1:

score: 100
Accepted
time: 0ms
memory: 12004kb

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: 1ms
memory: 12076kb

input:

3
1 2
0
1 2
1
2 2
1 0

output:

1 1
0
1 1
0
1 3
1 

result:

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