The Unsolvable Problem

题目链接: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 }
原文地址:https://www.cnblogs.com/huaszjh/p/4656420.html