相等的最小公倍数 | ||||||
| ||||||
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<=40的YES解:
然后发现,如果对应是YES的解,那么一定能在从2~n-1中找到两个数,使其互质(gcd==1)相乘能够得到n。
2、那么对应,如果能够从2~n-1中找到两个数,使其互质(gcd==1)相乘能够得到n,那么输出YES,否则输出NO.
暴力代码:
#include<stdio.h>
#include<string.h>
using namespace std;
#define ll __int64
ll lc[510];
ll gcd(ll x,ll y)
{
if(x%y==0)return y;
else return gcd(y,x%y);
}
ll lcm(ll x,ll y)
{
return x*y/gcd(x,y);
}
int main()
{
for(ll n=1;n<=40;n++)
{
ll output=1;
for(ll i=1;i<=n;i++)
{
output=lcm(output,i);
}
lc[n]=output;
printf("%I64d\n",output);
}
for(int i=1;i<=40;i++)
{
if(lc[i]==lc[i-1])
{
printf("%d\n",i);
}
}
}
Ac代码:
#include<stdio.h>
#include<string.h>
using namespace std;
int gcd(int x,int y)
{
if(x%y==0)return y;
else return gcd(y,x%y);
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
int flag=0;
for(int i=2;i<n;i++)
{
if(n%i==0)
{
int u=i;int v=n/i;
if(gcd(u,v)==1)
{
flag=1;
printf("YES\n");
break;
}
}
}
if(flag==0)printf("NO\n");
}
}