嗯。。在SPOJ上刷的第二题。
一开始不知道哪错了,后来发现i出现了两遍。。
因为m<10^9,所以用素数筛筛32000以内的数,开一个4000的数组存储就行。然后再从n开始用素数筛,总之效率还行。
代码如下:
//0.01s 3.2M #include<cstdio> #include<cstring> #include<cmath> int n,i,j,t,m,k,tot; int a[100005],b[4000]; int prime[40000]; int shai(int s){ int i,j; memset(prime,0,sizeof(prime)); prime[1]=2; i=2; while(i<s){ prime[i]=1; for(j=i;j<=s/i;j++){ prime[j*i]=2; } while(prime[i])i++; } tot=0; for (i=1;i<=s;i++){ if (prime[i]==1)b[++tot]=i; } return 1; } int main(){ shai(32000); for (scanf("%d",&t);t;t--){ scanf("%d%d",&n,&m); k=m; k=int(sqrt(double(k))); memset(a,0,sizeof(a)); for (j=1;j<=tot;j++){ int less = n / b[j]; if (less<b[j])less=b[j]; for (i=less;i<=m/b[j];i++){ if (i*b[j]<n)continue; a[i*b[j]-n]=1; } if (b[j]*b[j]>m)break; } for (i=0;i<=m-n;i++){ if (a[i]==0&&i+n!=1)printf("%d\n",i+n); } if (t)printf("\n"); } return 0; }
时间: 2024-09-30 10:27:12