题目链接:http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=45783
题目大意:
多组案例T(1<=T<=10000),每组案例输入一个数n(2 <= n <= 10 9),有a和b两个数满足a+b=n,又有[a,b]为a和b的最小公倍数,问:[a,b]最大为多少
案例:
Sample Input
3 2 3 4
Sample Output
1 2 3
题目分析:
要注意的是,n数据过于庞大,如果采用枚举方式易超时!对于一个数n,满足条件的a、b有可能有多个,但越接近n/2,a*b越大,所以从n/2处入手,a、b不仅要满足其和为n,同时也需要两者间没有公约数。分情况讨论:
1.特殊情况n=2,输出结果1;
2.n为偶数,则又分两种情况:n/2为偶数,输出(n/2-1)*(n/2+1),
n/2为奇数,输出(n/2-2)*(n/2+2);
3.n为奇数,则输出n/2*(n/2+1)。
注:Microsoft Visual C++6.0不支持long long型,定义n时,编译采用long型,提交采用long long型!
源代码:
1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 int T; 6 cin>>T;//案例数 7 while(T--) 8 { long long n; 9 cin>>n; 10 if(n==2) cout<<"1"<<endl; 11 else if(n%2==0) //判断n的奇偶性,n为偶数 12 { if(n/2%2==0) 13 cout<<(n/2-1)*(n/2+1)<<endl; 14 else cout<<(n/2-2)*(n/2+2)<<endl; 15 } 16 else //n为奇数 17 cout<<n/2*(n/2+1)<<endl; 18 } 19 return 0; 20 }