本文出自:http://blog.csdn.net/svitter/
题意:
求解An 与 An-1是否相等。
n分为两个情况——
1.n为素数,
2.n为合数。
= =好像说了个废话。。素数的时候,可以直接输出no,因为素数不可能和An-1相等。合数的时候,如果n是a^b次方,那么也是NO。原因很简单,之前数字的最小公倍数的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;
}