题目描述
定义 An 为 1,2,…,n 的最小公倍数,例如,A1=1,A2=2,A3=6,A4=12,5=60,A6=60。
请你判断对于给出的任意整数 n,An 是否等于 An–1。如果 An 等于An-1则输出 YES 否则输出 NO。
分析
由最小公倍数的定义我们可以知道,如果 An=An-1 则 An-1 可以被 n 整除,首先,对于一个数 n 如果是素数,那么 An 不等于 An-1,其次,我们分析 n,如果对于小于 n 的每一对因子即 n=a*b(a<n 且 b<n),如果 a,b 不互素,那么 gcd(a,b)>1,则 lcm(a,b)=n/gcd(a,b)<n(lcm表示最小公倍数),那么很显然,如果 n 的每一对因子都是不互素的,则 n 不能整除 An-1,否则可以整除 An-1,因为 n 的因子肯定小于等于 n-1,所以其每一对因子的最小公倍数肯定可以整除 An-1,所以这道题就 0 变成了判断 n 是否有互素的一对因子,所以我们只要枚举 n的每一对因子,然后计算其最大公约数是否为 1,如果有一对互素的因子则输出 YES,否则输出 NO。
1 #include <iostream> 2 #include <stdio.h> 3 #include<math.h> 4 using namespace std; 5 6 int gcd(int a,int b)//求最大公约数 7 { 8 if(a==0) 9 return b; 10 int c; 11 while(b) 12 { 13 c=b; 14 b=a%b; 15 a=c; 16 } 17 return a; 18 } 19 int main() 20 { 21 int t; 22 scanf("%d",&t); 23 while(t--) 24 { 25 int n; 26 scanf("%d",&n); 27 if(n==2) 28 { 29 printf("NO ");continue;//特殊情况 30 } 31 int temp=sqrt(n),p,falg=0; 32 for(int i=2;i<=temp;i++)//遍历所有的因子对 33 if(n%i==0) 34 { 35 p=n/i; 36 if(gcd(p,i)==1)//判断是否互质 37 { 38 falg=1; 39 break; 40 } 41 } 42 43 if(falg) 44 printf("YES "); 45 else 46 printf("NO "); 47 } 48 return 0; 49 }