First Blood
题目描述
盖伦是个小学一年级的学生,在一次数学课的时候,老师给他们出了一个难题:
老师给了一个正整数 n,需要在不大于n的范围内选择三个正整数(可以是相同的),使它们三个的最小公倍数尽可能的大。盖伦很想第一个解决这个问题,你能帮助盖伦拿到“first blood”吗?
输入
首先是一个正整数T,表示有T组测试数据
每组测试数据是一个正整数n(1<=n<=10^6)
输出
对于每组测试数据,输出最大的最小公倍数,每个输出单独占一行
样例输入
2
9
7
样例输出
504
210
1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 #define ll long long 5 ll gcd(ll a,ll b) 6 { 7 if(b==0) 8 return a; 9 return gcd(b,a%b); 10 } 11 ll dd(ll a,ll b) 12 { 13 return a/gcd(a,b)*b; 14 } 15 int main() 16 { 17 int N; 18 scanf("%d",&N); 19 while(N--) 20 { 21 ll i,j,k,z,a; 22 cin>>a; 23 ll max=0; 24 for(i=a;i>0;i--) 25 { 26 if(i*i*i<max) 27 break; 28 for(j=a;j>0;j--) 29 { 30 if(i*j*j<max) 31 break; 32 for(k=a;k>0;k--) 33 { 34 if(i*j*k<max) 35 break; 36 z=dd(i,dd(j,k)); 37 if(z>max) 38 max=z; 39 } 40 } 41 } 42 cout<<max<<endl; 43 } 44 }