• [数论] hdu 5974 A Simple Math Problem (数论gcd)


    传送门

    •题意

    一直整数$a,b$,有

    $left{egin{matrix}
    x+y=a\
    LCM(x*y)=b
    end{matrix} ight.$

    求$x,y$

    •思路

    解题重点:若$gcd(p,q)=1$,则$gcd(p+q,pq)=1$

    设$gcd(x,y)=g$,令$p=frac{x}{g},q=frac{y}{g}$,$p,q$互素

    则$left{egin{matrix}
    x+y=p*g+q*g=(p+q)g=a\
    LCM(x,y)=frac{xy}{g}=p*q*g=b
    end{matrix} ight.$

    由于$p,q$互素,所以$gcd(a+b,ab)=gcd((p+q)*g,pqg)=g$

    所以的$gcd(x,y)=g=gcd(a+b,ab)$

    $left{egin{matrix}
    x+y=a\
    xy=bgcd(a,b)
    end{matrix} ight.$

    然后解方程组就ok了,

    不过要注意输出$x,y$先后顺序

    小的在前,大的在后,虽然题目里没说,但因为这wa了

    •代码

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define ll long long
     4 ll x,y,a,b;
     5 int main()
     6 {
     7     while(~scanf("%lld%lld",&a,&b))
     8     {
     9         bool flag=true;
    10         ll gcd=__gcd(a,b);
    11         ll ssub=a*a-4*b*gcd;
    12         ll sub=sqrt(ssub);
    13         if(ssub!=sub*sub)
    14             flag=false;
    15         if((a+sub)%2)
    16             flag=false;
    17         x=(a+sub)/2;
    18         y=a-x;
    19         if(flag)
    20             printf("%lld %lld
    ",min(x,y),max(x,y));
    21         else
    22             puts("No Solution");
    23     }
    24 }
    View Code
  • 相关阅读:
    SetTransform
    D3DXCreateText
    《高级游戏特性实现》考试样题
    KeyUp
    .FX File
    CMD
    X File Class
    《DirectX游戏设计》考试样题
    ps图片处理效果——很nice哦
    学习篇:来点水货要天天学习!!!
  • 原文地址:https://www.cnblogs.com/MMMinoz/p/11785359.html
Copyright © 2020-2023  润新知