http://acm.hdu.edu.cn/showproblem.php?pid=3826
数论的应用
1000000*1000000*10000000=10^18;所以我们只要找出1000000以内的素数,然后在这里找是否有素因子平方。大于这个范围的话,我们就可以认为这个数n最多可能由两个素数成绩组成的,然后判断是否有平方因子。
//数论 素数筛选
#include <stdio.h>
#include <math.h>
#include <string.h>
#define MAX 1000001
bool isprime[MAX];
int prime[78600];
int k = 0;
void init()
{
memset(isprime, true, sizeof(isprime));
int i, j;
for(i = 2; i <= MAX; i ++){
for(j = 2; j <= MAX && i * j <= MAX; j ++){
isprime[i * j] = false;
}
}
prime[k ++] = 2;
for(i = 3; i <= MAX; i += 2){
if(isprime[i]){
prime[k ++] = i;
// printf("%d\n", i);
}
}
}
int main()
{
// freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
int cas, t, i;
__int64 n, tmp;
bool flag;
init();
scanf("%d", &t);
for(cas = 1; cas <= t; cas ++){
scanf("%I64d", &n);
flag = true;
for(i = 0; i < k && (__int64)prime[i]*prime[i] <= n; i ++){
if(n % ((__int64)prime[i] * prime[i]) == 0){//
flag = false;
break;
}
while(n % prime[i] == 0)n /= prime[i];
}
tmp = (__int64)sqrt(n + 0.0);
if(n !=1 && (tmp*tmp == n))flag = false;
if(flag)printf("Case %d: Yes\n", cas);
else printf("Case %d: No\n", cas);
}
return 0;
}