标签:des style blog http java color
题目链接:
题目:
2 30 75
Case 1: Yes Case 2: No
因为数的范围为10的18次方,那么它的因子必须是小于10的6次方的,则n*n*n>10的18次方,所以打一个1000000的素数表,
首先是素数表,用筛法打素数表。复杂度为O(ologn),应该是目前来说最快的吧。。
如果一个数在整除素数1000000后任然大于10的6次方的话,则将其开方后再乘。详情参见小白178面。
有个非常详细的讲解的。
传送门 讲的非常好。。
我的代码如下:
#include<cstdio> #include<cstring> #include<cmath> const int maxn=80000+10; const int n=1000000; int prime[maxn],vis[n]; __int64 N; int pos; int init() { int c=0; int m; memset(vis,0,sizeof(vis)); m=sqrt(n+0.5); for(int i=2;i<=m;i++) { if(!vis[i]) { for(int j=i*i;j<=n;j+=i) vis[j]=1; } } for(int i=2;i<=n;i++) { if(!vis[i]) prime[c++]=i; } return c; } int judge() { for(int i=0;i<pos;i++) { while(N%prime[i]==0) { N=N/prime[i]; if(N%prime[i]==0) return 0; } } return 1; } int main() { __int64 x; int i,t,cas=1,ok; pos=init(); scanf("%d",&t); while(t--) { ok=1; scanf("%I64d",&N); if(!judge()) ok=0; if(N>1000000) { x=(int)sqrt(double(N)); if(x*x==N) ok=0; } if(ok) printf("Case %d: Yes\n",cas++); else printf("Case %d: No\n",cas++); } return 0; }
hdu3826 Squarefree number,布布扣,bubuko.com
标签:des style blog http java color
原文地址:http://blog.csdn.net/u014303647/article/details/35890027