SGU 113素数筛

 

113. Nearly prime numbers

time limit per test: 0.5 sec. 
memory limit per test: 4096 KB

Nearly prime number is an integer positive number for which it is possible to find such primes P1 and P2 that given number is equal to P1*P2. There is given a sequence on N integer positive numbers, you are to write a program that prints “Yes” if given number is nearly prime and “No” otherwise.

Input

Input file consists of N+1 numbers. First is positive integer N (1£N£10). Next N numbers followed by N. Each number is not greater than 109. All numbers separated by whitespace(s).

Output

Write a line in output file for each number of given sequence. Write “Yes” in it if given number is nearly prime and “No” in other case.

Sample Input

1
6

Sample Output

Yes

Author: Michael R. Mirzayanov
Resource: PhTL #1 Training Contests
Date: Fall 2001

一个数如果能被写成两个素数之积称之为near prime。

 

/**********************
* author:crazy_石头
* Pro:SGU 113
* algorithm:素数筛
* Time:15ms
* Judge Status:Accepted
***********************/
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>

using namespace std;

#define rep(i,h,n) for(int i=(h);i<=(n);i++)
#define ms(a,b) memset((a),(b),sizeof(a))
#define eps 1e-6
#define INF 1<<29
#define LL __int64
const int maxn=40000+5;
const int maxm=200+10;

int prime[maxn],cnt;
int p[maxn];
int n;

inline void init_prime()
{
    ms(p,0);
    p[0]=p[1]=1;//0和1不是素数;
    rep(i,2,maxn)
    {
        if(!p[i])
        {
            for(int j=i+i;j<=maxn;j+=i)
            p[j]=1;//若i是素数,则它的倍数不是素数,改为1;
        }
    }
    rep(i,2,maxn)
    {
        if(!p[i])
        prime[cnt++]=i;
    }
}

inline bool judge(int n)
{
    if(n<2)return false;
    for(int i=2;i*i<=n;i++)
        if(n%i==0)return false;
    return true;
}

int main()
{
    int test;
    scanf("%d",&test);
    while(test--)
    {
        cnt=0;
        init_prime();
        int ok=0;
        scanf("%d",&n);
        rep(i,0,cnt-1)
        {
            if(n%prime[i]==0&&judge(n/prime[i]))
            {//n等于两个素数之积,说明n%prime[i]==0并且另一个除数也是素数;
                ok=1;
                break;
            }
        }
        if(ok)
            printf("Yes\n");
        else
            printf("No\n");
    }
    return 0;
}


 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值