2 30 75
Case 1: Yes Case 2: No
能输出no 不能输出yes
/*一个数n能被一个数的平方整除 那么这个数一定能被一个质数的平方整出 如果能被一个偶数的平方整出 由于偶数=2*x 一定含有质数2 故能被质素2的平方整出 假如 一个数能被 一个奇数的平方整除 奇数=质数*x 故能被质素的平方整出 对于本题数据较大 可以做如下处理 如果n>10^6 1 求出10^6内的所有质数 看n是否可以分解成这些质数某个的平方 如果可以输出No 2 数据最大为10^18 当那么最多存在一个数x(>10^6)使得 x*x整除n 因为n*n*n大于10^18 那么此时 在上面的操作中 用n除以n能整除且不是平方的质数 那么剩下的数n就应该能够被开方了 因为所有小于10^6的质数都处理了 只可能有3个大于10^6的质数 输入的数n=x*x*y,y x x不可能同时大于10^6,所以当x大于时候 y会小于 这时候已经把y处理了 故对其开方 如果能开放 则输出No 思维扩展: 对于一个平方数 一定可以分解成某个质数的平方*某些质数 */ #include<stdio.h> #include<math.h> #include<string.h> int vis[1000000+5]; int prime[79000]; int cnt[79000+5]; int c; void get_prime() { int i,j,n,m; c=0; n=1000000; m=(int)sqrt(n+0.5); memset(vis,0,sizeof(vis)); for(i=2;i<=m;i++) if(!vis[i]) { for(j=i*i;j<=n;j+=i) vis[j]=1; } for(i=2;i<=n;i++) if(!vis[i]) prime[c++]=i; } int main() { int i,j,cas,flag,k; __int64 n,m; double num; get_prime(); scanf("%d",&cas); for(k=1;k<=cas;k++) { scanf("%I64d",&n); memset(cnt,0,sizeof(cnt)); flag=0; m=n; for(j=0;j<c;j++) { //m=n; n=m; while(m%prime[j]==0) { m/=prime[j]; cnt[j]++; if(cnt[j]>=2) {flag=1;break;} } if(flag) break; } if(n>1000000) { num=sqrt((double)n);//这里要注意 必须要加double 否则编译错误 if(floor(num+0.5)==num) flag=1; } if(flag) printf("Case %d: No\n",k); else printf("Case %d: Yes\n",k); } return 0; }