以下代码区别只在于 maxn 从 10005 改为 20005 就过掉了,问题在哪里?
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;
}