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;
    }

  • 相关阅读:
    字符串的全排列

    链表
    青蛙跳一格或者两格,n格跳法
    二叉树
    Concurrent实现原理
    sql语句总结 (转) http://blog.csdn.net/fengfeng91/article/details/15029173
    ArrayList实现原理
    java虚拟机 内存分配
    【转】关于Quartus ii无法识别Modelsim路径的问题
  • 原文地址:https://www.cnblogs.com/hbutACMER/p/4226545.html
Copyright © 2011-2022 走看看