求最小公倍数 初等数

来源:互联网 发布:数据库设计案例分析 编辑:程序博客网 时间:2024/06/16 09:16
杭电上diy上一道很有意思的题
描述:
在学习完各类算法之后,yuna决定开始学习数论了。yuna神当然从最简单的最小公倍数学起喽~~~~~
定义 为1,2,…,n的最小公倍数,例如,B1 = 1,B2 = 2,B3 = 6,B4 = 12,B5 = 60,……。 
yuna想知道对于给出的任意整数n,Bn是否等于Bn-1。yuna当然是知道答案的喽,但是她想考考rexdf,这次rexdf囧了,请帮帮他吧!

Input

本题有多组测试数据,输入的第一行是一个整数T代表着测试数据的数量,接下来是T组测试数据。 
对于每组测试数据:包含一个整数n (2 ≤ n ≤ 1016)。

Output

对于每组测试数据: 
第1行 如果Bn等于Bn-1则输出YES否则输出NO。

Sample Input

1 6

Sample Output

YES

Author

Kuangbin

Source

developing schools contest 5

算法 :这样考虑:例如 10 那么他前面有9个数,B9的最小公倍数能被2和5整除 那么他一定能被10整除,所以B9和B10是一样的。
但是按照此方法要注意 的是16 前面有15个数,分解成2,8  4,4 两个相同的4是不成立的,应为8是2*2*2 包含了2 所以 2和8也是不成立的,所以前16和前15的最小公倍数不同。

post code:
#include<iostream>#include<stdio.h>#include<math.h>using namespace std;int ji; __int64 num;int judge()         //判断质数{  int i;  ji=(int)sqrt((double)num);  for(i=2;i<=ji+1;i++)  {  if(num%i==0)break;  }  if(i==ji+2)return 1;  else return 0;}int main(){ int n,flag,i; cin>>n;  while(n--)  {   scanf("%I64d",&num);   flag=judge();         //判断是否是质数 是质数 则不相同   if(flag==1){cout<<"NO"<<endl;continue;}   else{     for(i=2;i<=2*ji;i++)     {      if(num%i==0&&i<(num/i)&&(num/i)%i!=0) //若不是质数 被两个数整除 且两个数不等,一个数不是另一个数的约数 成立        {printf("YES\n");flag=1;break;}              }     if(flag==0)printf("NO\n");  //否则不成立   }  }  return 0;}



原创粉丝点击