A 暴力搜索 剪枝是关键

Description

盖伦是个小学一年级的学生,在一次数学课的时候,老师给他们出了一个难题:
老师给了一个正整数 n,需要在不大于n的范围内选择三个正整数(可以是相同的),使它们三个的最小公倍数尽可能的大。盖伦很想第一个解决这个问题,你能帮助盖伦拿到“first blood”吗?


Input

首先是一个正整数T,表示有T组测试数据
每组测试数据是一个正整数n(1<=n<=10^6)

Output

对于每组测试数据,输出最大的最小公倍数,每个输出单独占一行

Sample Input

2
9
7

Sample Output

504
210

 1 # include <cstdio>
 2 # include <cstring>
 3 # include <iostream>
 4 # define LL long long
 5 using namespace std ;
 6 
 7 LL gcd(LL a,LL b)
 8 {   if(b==0)
 9       return a;
10     return gcd(b,a%b);
11 }
12 
13 LL lcm(LL a,LL b)
14 {
15     return a/gcd(a,b)*b;
16 }
17 
18 
19 int main ()
20 {
21    // freopen("in.txt","r",stdin) ;
22     int T ;
23     cin>>T ;
24 
25     while (T--)
26     {
27         LL n ;
28         cin>>n ;
29         LL i , j , k , Max = 0;
30         LL t ;
31         for (i = n ; i >= 1 ; i--)
32         {
33             if (i*i*i < Max)
34                      break ;
35 
36             for (j = n ; j >= 1 ; j--)
37             {
38                 if (i*j*j < Max)
39                      break ;
40 
41                 for (k = n ; k >= 1 ; k--)
42                 {
43                     if (i*j*k < Max)
44                      break ;
45                      t = lcm(i,lcm(j,k)) ;
46                        if (t > Max)
47                          Max = t ;
48 
49                 }
50             }
51         }
52         cout<< Max<<endl ;
53     }
54 
55 
56 
57     return 0 ;
58 }
View Code
原文地址:https://www.cnblogs.com/mengchunchen/p/4528259.html