uva 11889 GCD

来源:互联网 发布:java 参数 编辑:程序博客网 时间:2024/05/16 07:07

#include <iostream>using namespace std;int gcd(int a, int b){    return b == 0 ? a : gcd(b, a % b);}int main(int argc, char *argv[]){    long long a, L, t, i;    cin >> t;    while (t--)    {        cin >> a >> L;        if (L % a) cout << "NO SOLUTION" << endl;        else        {            for (i = L / a; i <= L; i += L / a)            {                if (a / gcd(a, i)*i == L) { cout << i << endl; break;}            }            if (i > L) cout << "NO SOLUTION" << endl;        }    }    return 0;}



题目:已知两个数的最小公倍数和其中一个数,求另一个数。



分析:数论,构造本题可以才用枚举的方式求解,这里利用数论的方法。


            设A = G * A0,B = G * B0,其中GCD(A0,B0)= 1;


            如果GCD(C/ A0,A0)= GCD(B0*g,A0)=1,则B = B0可以满足题意;


            否则GCD(C/ A0,A0)= GCD(B0*g,A0)= GCD(B0* G0* G',A1 * G0)= G0;


                    此时取B1= B0·G0,则有LCM(A,B)= A 0* B0* G= A1 * B1*g;


                   (如果取B = B 0,则LCM(A,B)= A 1* B0* G= A0* B0* G'与假设矛盾)


                    如果最大公约数(C / A 1,A 1)=最大公约数(A0* B0*g/ A 1,A 1)=最大公约数(G* G'* B0,A1)= 1,则B = B1满足题意;


                    否则,继续迭代求出B2,A2,直到GCD(C/ AK,AK)= 1;(时间复杂度为(LGN)^2);


说明:本题使用构造方法求解,其正确性在构造结束时即被证明。
0 0