[UVa 11889] Benefit (基础数论+GCD+LCM)

UVa - 11889

已知 A,C,求最小的 B使得 LCM(A, B) = C
首先如果 A不能整除 C,则无解

lcm(A,B)=C=ABgcd(A,B)
CA=Bgcd(A,B)
gcd(A,B)=D A=AD B=BD ,其中 A B 互质
此时我们已知 A ,即 AD ,已知 BD ,即 B
要求得 B ,即将 D 乘到 B 上得到 BD=B 即可
方法就是求得 D=gcd(AD,B)
1) 如果 D=1 ,说明 AD B 已经互质了,那么就认为 D=1 ,将 AD 看作 A
2) 如果此 D1 ,那么将 BD ADD ,迭代直至 D=1

#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <queue>
using namespace std;
typedef pair<int,int> Pii;
#define MST(a,b) memset(a,b,sizeof(a))
#define CLR(a) MST(a,0)
#define LL long long
#define ULL unsigned long long
int maxx(int a,int b){return a>b?a:b;}
int minn(int a,int b){return a<b?a:b;}
int abss(int a){return a<0?(-a):a;}

int GCD(int a,int b){return b?GCD(b,a%b):a;}
int A,C;

int main()
{
    int T;
    scanf("%d", &T);
    for(int ck=1; ck<=T; ck++)
    {
        scanf("%d%d", &A, &C);
        if(C%A){puts("NO SOLUTION");continue;}
        else
        {
            int B=C/A;
            int D;
            while((D=GCD(B,A))!=1)
            {
                B*=D;
                A/=D;
            }
            printf("%d\n", B);
        }
    }
    return 0;
}

你可能感兴趣的:(uva)