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

First Blood

题目描述

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

输入

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

输出

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

样例输入

2
9
7

样例输出

504
210
 #include<cstdio>
#include<iostream>
using namespace std;
#define ll long long
ll gcd(ll a,ll b)
{
if(b==)
return a;
return gcd(b,a%b);
}
ll dd(ll a,ll b)
{
return a/gcd(a,b)*b;
}
int main()
{
int N;
scanf("%d",&N);
while(N--)
{
ll i,j,k,z,a;
cin>>a;
ll max=;
for(i=a;i>;i--)
{
if(i*i*i<max)
break;
for(j=a;j>;j--)
{
if(i*j*j<max)
break;
for(k=a;k>;k--)
{
if(i*j*k<max)
break;
z=dd(i,dd(j,k));
if(z>max)
max=z;
}
}
}
cout<<max<<endl;
}
}
上一篇:《KAFKA官方文档》入门指南(转)


下一篇:【私人向】Java复习笔记