HDU 4627 The Unsolvable Problem 杭电多校联赛第三场1009 数学题

题意描述:给出一个n,要求在所有满足n = a+b的a和b里面求a和b的最小公倍数最大的两个数的最小公倍数。

解题报告:比赛的时候看到这个题的第一反应就是寻找这两个数一定是在a和b比较接近的地方找,这样才能保证a和b的最小公倍数最大,首先,奇数和偶数是一定要分开的讨论的,因为奇数和偶数的一半是不同的,奇数的一半可能就是所要的结果,但是偶数的一半可以确定一定不是所要的结果,因为偶数一半刚好a和b就相等了,最小公倍数就是他们本身了,这是最小的了,然后偶数里面又要分开讨论,一种是这个偶数的一半是奇数,另一种是这个偶数的一半也是偶数的情况,对于是奇数的,结果就是将一半分别进行加2减二得到,然后对于是偶数的只要加1和减1就可以了,然后求他们的最小公倍数,所求出来的一定是最大的。

 1 #include<cstdio>
 2 #include<cstring>
 3 typedef __int64 INT;
 4 
 5 INT GCD(INT a,INT b) {
 6     return a%b==0? b:GCD(b,a%b);
 7 }
 8 int main() {
 9     int T;
10     INT n;
11     scanf("%d",&T);
12     while(T--) {
13         INT temp,max;
14         scanf("%I64d",&n);
15         if(n == 2) {
16             printf("1\n");
17             continue;
18         }
19         temp  = n/2;
20         if(n & 1)
21         printf("%I64d\n",((n-temp)/GCD(n-temp,temp))*temp);
22         else {
23             if(n == 2)
24             printf("1\n");
25             else if(temp & 1)
26             printf("%I64d\n",((temp+2)/GCD(temp+2,temp-2))*(temp-2));
27             else printf("%I64d\n",((temp+1)/GCD(temp+1,temp-1))*(temp-1));
28         }
29     }
30     return 0;
31 }
View Code

 

posted @ 2013-07-30 20:33  xiaxiaosheng  阅读(222)  评论(0编辑  收藏  举报