首页 > 代码库 > Hrbust1328 相等的最小公倍数 (筛素数,素因子分解)

Hrbust1328 相等的最小公倍数 (筛素数,素因子分解)

本文出自:http://blog.csdn.net/svitter/


题意:

求解An 与 An-1是否相等。

n分为两个情况——

1.n为素数,

2.n为合数。

=  =好像说了个废话。。素数的时候,能够直接输出no,由于素数不可能和An-1相等。合数的时候,假设n是a^b次方,那么也是NO。原因非常easy,之前数字的最小公倍数的n的因子次方数,不能超过n的次方数。


//============================================================================
// Name        : 数论问题.cpp
// Author      :
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
#include <stdio.h>
#include <string.h>

using namespace std;
#define lln long long int
#define MAXN 1000001

bool vis[MAXN];
int prime[100000];
int p;

void Prime()
{
    //0为不是合数,1为是合数
    memset(vis, 1, sizeof(vis));
    p = 0;
    int i, j;
    for(i = 2; i < MAXN; i++)
    {
        if(vis[i])
        {
            prime[p++] = i;
            for(j = 2 * i; j < MAXN; j += i)
                vis[j] = 0;
        }
        else
            continue;
    }
}

void ace(){
	//init
	Prime();
	//work point
	int t, i;
	//num
	int a;
	int num;

	cin >> t;
	while(t--){
		scanf("%d", &a);
		if(a == 2)
		{
            printf("NO\n");
            continue;
        }
		if(vis[a])
            printf("NO\n");
        else
        {
            num = 0;
            for(i = 0 ; i <= p; i++)
            {
                if(a % prime[i] == 0)
                {
                    num++;
                    while(a % prime[i] == 0)
                        a /= prime[i];
                }
                if(a == 1)
                    break;
            }
            if(num >= 2)
                printf("YES\n");
            else
                printf("NO\n");
        }
	}
}

int main() {
	ace();
	return 0;
}