杭电上diy上一道很有意思的题
描述:
在学习完各类算法之后,yuna决定开始学习数论了。yuna神当然从最简单的最小公倍数学起喽~~~~~
定义 为1,2,…,n的最小公倍数,例如,B1 = 1,B2 = 2,B3 = 6,B4 = 12,B5 = 60,……。
yuna想知道对于给出的任意整数n,Bn是否等于Bn-1。yuna当然是知道答案的喽,但是她想考考rexdf,这次rexdf囧了,请帮帮他吧!
定义 为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)。
对于每组测试数据:包含一个整数n (2 ≤ n ≤ 1016)。
Output
对于每组测试数据:
第1行 如果Bn等于Bn-1则输出YES否则输出NO。
第1行 如果Bn等于Bn-1则输出YES否则输出NO。
Sample Input
1 6
Sample Output
YES
Author
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;
}
767

被折叠的 条评论
为什么被折叠?



