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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值