zoukankan      html  css  js  c++  java
  • 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
    ");
    17             continue;
    18         }
    19         temp  = n/2;
    20         if(n & 1)
    21         printf("%I64d
    ",((n-temp)/GCD(n-temp,temp))*temp);
    22         else {
    23             if(n == 2)
    24             printf("1
    ");
    25             else if(temp & 1)
    26             printf("%I64d
    ",((temp+2)/GCD(temp+2,temp-2))*(temp-2));
    27             else printf("%I64d
    ",((temp+1)/GCD(temp+1,temp-1))*(temp-1));
    28         }
    29     }
    30     return 0;
    31 }
    View Code
  • 相关阅读:
    Fedora/CentOS使用技巧
    Haproxy配置
    iscsi使用教程
    Linux网络配置
    Linux命令使用
    luogu-1908 逆序对 离散化+树状数组
    算法题目签到表
    [笔记-机器学习]贝叶斯分类器的原理及实现
    [笔记-数据结构]树状数组
    [笔记-数据结构]哈希表
  • 原文地址:https://www.cnblogs.com/xiaxiaosheng/p/3226452.html
Copyright © 2011-2022 走看看