数据范围求助
查看原帖
数据范围求助
157884
Glassy_Sky楼主2023/8/2 08:32

以下代码区别只在于 maxnmaxn 从 1000510005 改为 2000520005 就过掉了,问题在哪里?

RE代码:

#include<bits/stdc++.h>
using namespace std;

const int maxn=1e4+5;

int n,a[maxn],prime[maxn],cnt=0;
long long F[maxn];
bool notPri[maxn];

int main() {
	for(int i=2;i<=maxn-5;i++) {
		if(!notPri[i]) prime[++cnt]=i;
		for(int j=1;j<=cnt&&i*prime[j]<=maxn-5;j++) {
			notPri[i*prime[j]]=true;
			if(i%prime[j]==0) break;
		}
	}
	while(scanf("%d",&n)!=-1) {
		memset(F,0,sizeof F);
		int maxx=0;
		for(int i=1;i<=n;i++) {
			scanf("%d",&a[i]);
			F[a[i]]++;
			maxx=max(maxx,a[i]);
		}
		for(int i=1;prime[i]<=maxx;i++)
			for(int j=maxx/prime[i];j>=1;j--)
				F[j]+=F[j*prime[i]];
		for(int i=1;i<=maxx;i++)
			F[i]=F[i]*(F[i]-1)*(F[i]-2)*(F[i]-3)/24;
		for(int i=1;prime[i]<=maxx;i++)
			for(int j=1;j*prime[i]<=maxx;j++)
				F[j]-=F[j*prime[i]];
		printf("%lld\n",F[1]);
	}
	return 0;
}

AC代码:

#include<bits/stdc++.h>
using namespace std;

const int maxn=2e4+5;

int n,a[maxn],prime[maxn],cnt=0;
long long F[maxn];
bool notPri[maxn];

int main() {
	for(int i=2;i<=maxn-5;i++) {
		if(!notPri[i]) prime[++cnt]=i;
		for(int j=1;j<=cnt&&i*prime[j]<=maxn-5;j++) {
			notPri[i*prime[j]]=true;
			if(i%prime[j]==0) break;
		}
	}
	while(scanf("%d",&n)!=-1) {
		memset(F,0,sizeof F);
		int maxx=0;
		for(int i=1;i<=n;i++) {
			scanf("%d",&a[i]);
			F[a[i]]++;
			maxx=max(maxx,a[i]);
		}
		for(int i=1;prime[i]<=maxx;i++)
			for(int j=maxx/prime[i];j>=1;j--)
				F[j]+=F[j*prime[i]];
		for(int i=1;i<=maxx;i++)
			F[i]=F[i]*(F[i]-1)*(F[i]-2)*(F[i]-3)/24;
		for(int i=1;prime[i]<=maxx;i++)
			for(int j=1;j*prime[i]<=maxx;j++)
				F[j]-=F[j*prime[i]];
		printf("%lld\n",F[1]);
	}
	return 0;
}
2023/8/2 08:32
加载中...