first blood暴力搜索,剪枝是关键

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 }
原文地址:https://www.cnblogs.com/a1225234/p/4530380.html