First Blood
Time Limit: 1000 ms Memory Limit: 64 MB
Total Submission: 79 Submission Accepted: 23
Total Submission: 79 Submission Accepted: 23
Description
盖伦是个小学一年级的学生,在一次数学课的时候,老师给他们出了一个难题:
老师给了一个正整数 n,需要在不大于n的范围内选择三个正整数(可以是相同的),使它们三个的最小公倍数尽可能的大。盖伦很想第一个解决这个问题,你能帮助盖伦拿到“first blood”吗?
老师给了一个正整数 n,需要在不大于n的范围内选择三个正整数(可以是相同的),使它们三个的最小公倍数尽可能的大。盖伦很想第一个解决这个问题,你能帮助盖伦拿到“first blood”吗?
Input
首先是一个正整数T,表示有T组测试数据
每组测试数据是一个正整数n(1<=n<=10^6)
每组测试数据是一个正整数n(1<=n<=10^6)
Output
对于每组测试数据,输出最大的最小公倍数,每个输出单独占一行
Sample Input
Original | Transformed |
2 9 7
Sample Output
Original | Transformed |
504 210
暴力加剪枝,一开始我以为是数学后来发现不是的!
#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
long long gcd(long long n,long long m)
{
long long a,b,c;
a=n,b=m;
while(b!=0)
{
c=a%b;
a=b;
b=c;
}
return n*m/a;
}
int main()
{
long long t,i,j,k;
long long n,sum,maxs,m,q;
scanf("%lld",&t);
while(t--)
{
scanf("%lld",&n);
maxs=0;
for(i=n;i>=1;i--)
{
if(i*i*i<maxs)
{
break;
}
for(j=n;j>=1;j--)
{
if(i*j*j<maxs)
{
break;
}
for(k=n;k>=1;k--)
{
if(i*j*k<maxs)
{
break;
}
m=gcd(i,gcd(j,k));
if(m>maxs)
{
maxs=m;
}
}
}
}
printf("%lld\n",maxs);
}
}