您的位置:首页 > 其它

uva 11889 GCD

2016-02-28 17:02 260 查看
#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);

说明:本题使用构造方法求解,其正确性在构造结束时即被证明。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: