zoukankan      html  css  js  c++  java
  • 数论 UVA 11889

    有关数论的题目,题目大意是给你两个数a和c,c为a和另一个数b的最小公倍数,要求你求出b的最小值。由最大公约数gcd(a,b)和最小公倍数lcm(a,b)之间的关系可知,lcm(a,b)*gcd(a,b)=a*b;

    则b=lcm(a,b)*gcd(a,b)/a,b=c*gcd(a,b)/a,b/gcd(a,b)=c/a。因为c/a是b除去gcd(a,b)后的部分。若gcd(a,c/a)=1,就表明c/a就是我们要求的答案;否则,就说明c/a小于b,需要还原。还原

    的过程中,首先求出gcd(a,c/a),让c/a乘上gcd(a,c/a)得到(c/a)',a除以gcd(a,c/a)得到a',然后判断gcd((c/a)',a')是否为1,如果是说明已经还原完成,得到了答案,输出答案;否则重复之前的操作

    即让(c/a)'*gcd((c/a)',a'),a'/gcd((c/a'),a'),在继续判断。

    #include <stdio.h>
    #include <stdlib.h>
    int gcd(int x,int y)
    {
    int t,s;
    while(y!=0)
    {
    t=x%y;
    x=y;
    y=t;

    }
    return x;
    }
    int main()
    {
    int t;
    scanf("%d",&t);
    while(t--)
    {
    int a,c,b,t;
    scanf("%d%d",&a,&c);
    if(c%a==0)
    {
    int p;
    b=c/a;
    p=gcd(a,b);
    if(p==1)
    printf("%d ",b);
    else
    {
    int m,n,t;
    m=a/p;
    n=b*p;
    p=gcd(m,n);
    while(p!=1)
    {
    m=m/p;
    n=n*p;
    p=gcd(m,n);
    }
    printf("%d ",n);
    }
    }
    else
    printf("NO SOLUTION ");
    }
    return 0;
    }

  • 相关阅读:
    JSP/Servlet相关
    mysql 相关问题解决
    Git常用
    利用JDBC连接MySQL并使用MySQL
    memcache、redis原理对比
    Python 2.7.x 和 3.x 版本的重要区别
    python 单例模式
    python 装饰器原理及用法
    python 冒泡排序
    python 迭代器和生成器
  • 原文地址:https://www.cnblogs.com/hbutACMER/p/4226545.html
Copyright © 2011-2022 走看看