zoukankan      html  css  js  c++  java
  • 题解 UVa11889

    题目大意 \(T\) 组数据,每组数据给定两个正整数 \(A,C\),求使 \(LCM(A,B)=C\) 的最小的 \(B\),若无解则输出NO SOLUTION。

    分析\(C\%A=0\) 时有解。若有 \(LCM(A,B)=C\),则有 \(GCD(C/B,C/A)=1\)。令 \(m=C/B,B=C/m\),则问题转化为求最大的 \(m\),使 \(A\%m=0,GCD(m,C/A)=1\)。不难发现,\(m\) 最大即为 \(A\) 滤去所有 \(C/A\) 的因子。一种比较巧妙的做法是不断求 \(GCD(A,C/A)\),每次 \(A\) 除以 \(GCD(A,C/A)\)。当 \(GCD(A,C/A)=1\) 时,就已经完成了过滤。最后的答案即为每次 \(GCD\) 的积乘以 \(C/A\)

    #include<bits/stdc++.h>
    using namespace std;
    
    int T, A, B, C, d, k;
    
    int gcd(int a, int b)
    {
    	if(!b) return a;
    	return gcd(b, a % b);
    }
    
    int main()
    {	
    	scanf("%d", &T);
    	while(T--) {
    		scanf("%d%d", &A, &C);
    		if(C % A) { puts("NO SOLUTION"); continue; }
    		
    		B = C / A, k = 1;
    		while((d = gcd(A, B)) != 1) k *= d, A /= d;
    		printf("%d\n", B * k);
    	}
    }
    
  • 相关阅读:
    error: with modifiers "public "
    移除元素
    删除有序数组中的重复项
    最长公共前缀
    如何杀死window进程
    IDEA卡顿问题
    合并两个有序链表
    开闭原则
    字符集和sql语句GROUPBY查询的版本问题
    里氏替换原则
  • 原文地址:https://www.cnblogs.com/whx1003/p/11741370.html
Copyright © 2011-2022 走看看