相等的最小公倍數 | ||||||
|
||||||
Description | ||||||
定義An爲1,2,…,n的最小公倍數,例如,A1 = 1,A2 = 2,A3 = 6,A4 = 12,A5 = 60,A6 = 60。 請你判斷對於給出的任意整數n,An是否等於An – 1。 |
||||||
Input | ||||||
本題有多組測試數據,輸入的第一行是一個整數T代表着測試數據的數量,接下來是T組測試數據。 對於每組測試數據: 第1行 包含一個整數n (2 ≤ n ≤ 106)。 |
||||||
Output | ||||||
對於每組測試數據: 第1行 如果An等於An-1則輸出YES否則輸出NO。 |
||||||
Sample Input | ||||||
1 6 |
||||||
Sample Output | ||||||
YES |
||||||
Source | ||||||
哈理工2012春季校賽熱身賽 2012.04.03 | ||||||
Author | ||||||
齊達拉圖@HRBUST |
首先判斷該數n是否爲素數,,是素數的話,,An An-1不可能相等,,因爲An會比An-1 乘上一個更大的新素數。。
然後在n不是素數的前提下,,判斷n是否存在 一對互素的因子..即n=a*b(a,b互素)(即gcd(a,b)==1).存在則輸出YES
/**怎麼判斷相鄰兩個數的lcm是否相等.**/
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int gcd(int a,int b)
{
if(b==0) return a;
else return gcd(b,a%b);
}
int main()
{
int T,n;
scanf("%d",&T);
while(T--)
{
int i;
bool p=true;
scanf("%d",&n);
int temp=(int)sqrt((double)n);
if(n==2)
{
printf("NO\n");continue;
}
for(i=2;i<=temp;i++)
if(n%i==0) break;
if(i==temp+1)
{
printf("NO\n");continue;
}
for(i=2;i<=temp;i++)
{
if(n%i==0)
{
int q=n/i;
if(gcd(q,i)==1)
{
p=false;break;
}
}
}
if(p) printf("NO\n");
else printf("YES\n");
}
return 0;
}