数论 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\n",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",n);
}
}
else
printf("NO SOLUTION\n");
}
return 0;
}

时间: 2024-08-29 05:15:17

数论 UVA 11889的相关文章

Uva 11889 - Benefit( 数论 )

Uva 11889 - Benefit( 数论 ) 题意: calculate the lowest integer B such that LCM(A, B) = C 分析: LCM(A,B) = C = A*B/GCD(A,B)C*GCD(A,B) = A*BC/A = B/GCD(A,B)如果C%A != 0 无解否则, 令t = C/AB = t * GCD(A,B) 即B 一定是 t 的整数倍从t开始枚举B #include <cstdio> typedef long long LL

UVA 11889 Benefit

11889 Benefit 题意: 给出T(T ≤ 100000)组数据:每组数据中给出A,C (1 ≤ A, C ≤ 10e7):已知LCM(A,B)=C,求最小的B 如果无解的话,输出 NO SOLUTION 思路: 比较难懂,可以多思考几遍.首先b=c/a;如果b不是int;直接无解:然后循环(对A和B求GCD的一值,再A/=值)直到那个值为1: 反例:12 16 48,顺便借这个例子分析一下:b=c/a=48/12=4,12和4的LCM是12不是48因为他们的有GCD影响,然后GCD的那

数论 UVA 10780

数论题目.有关内容:整数质因数分解,N的阶乘质因数分解,整除的判断. 这道题的题意是给你两个数n.m,要求你求出n!所能整除的m^k的最大值的k是多少. 由于数据范围:1<m<5000,1<n<10000.通过分析我们可知,当n在100 以上后n!早已超出了int甚至__int64的范围了.即使在int范围内,要算出n!和m^k然后依次遍历,这样会超时. 所以我们可以考虑将如果m能整除n!,那么m^k才会有可能整除n!.如果n!可以整除m,那么将m进行质因数分解后,所得的所有质因子

数论 UVA 10943

这是一道关于组合数和隔板法的数论题目.题目说的是选出k个不同且不大于N的数字进行相加,要求这些数字之和等于N,结果要求输出这样的数有多少组.这里可以将问题利用隔板法来转换,那么题目的叙述可以转换成:这里有N个相同的小球,要求放到k个相同的盒子中,盒子可以为空,但一定要把所有球都放进盒子中,问共有多少种放法.经过题目描述的转换,这道题目就可以运用隔板法的公式:所有符合条件的情况的种数为c[N+k-1][k-1]. 由组合数的公式可得c[m][n]=c[m-1][n-1]+c[m-1][n].由于这

UVa 11889 (GCD) Benefit

好吧,被大白书上的入门题给卡了.=_=|| 已知LCM(A, B) = C,已知A和C,求最小的B 一开始我想当然地以为B = C / A,后来发现这时候的B不一定满足gcd(A, B) = 1 A要不断地除去gcd(A, B),直到满足gcd(A, B) = 1 B最后就应该乘上A除去的值 1 #include <cstdio> 2 3 typedef long long LL; 4 5 LL gcd(LL a, LL b) 6 { return b == 0 ? a : gcd(b, a%

Uva 11889 Benefit (lcm与gcd)

题意:给你两个数,a,c,求出 lcm(a,b)==c 时的 b 的最小值 思路:我们知道一个性质 gcd(a,b)*lcm(a,b) = a*b 由此我们可以得到 b = gcd(a,b)*lcm(a,b)/a 那我们可以先用 lcm(a,b)/a 计算出假定的b值 如果 gcd(a.b)==1 那么b的最小值确定 如果 gcd(a,b)!=1 我们就要通过计算来找到 计算方法为 a=a/gcd(a,b) b=b*gcd(a.b) 样例: 4 6 12 2 6 32 1760 7 16 结果:

UVa 11889 最小公倍数

https://vjudge.net/problem/UVA-11889 题意: 输入两个整数A和C,求最小的整数B使得lcm(A,B)=C. 思路: 首先C是A的公倍数,如果C%A不为0肯定是无解的. 接下来先让B=C/A,求g=gcd(A,B),如果g不为1的话,那么A.B的最小公倍数就是A*B/g,不等于c. 所以我们要去掉这个g,也就是让A/g,B*g. 1 #include<iostream> 2 #include<cstdio> 3 #include<cmath&

数论 UVA 11076

这道题目的意思简单易懂说的是给你n个数(可能有重复相同的数字),列出他们所有排列的情况,再逐位相加,求出和,例如:给你1,2,3,则排列的情况为<123>, <132>, <213>, <231>, <312>, <321> ,则相加的和为1332.思路很好把握,但是需要比较扎实的数学基础,因为该问题的核心公式需要理解和记忆否则很难做出来. 这道题目的核心知识点是:多重集合排列(也叫不全相异元素全排列),这里有一个定理:设S是一个多重

数论 UVA 11388

这道题是关于两个数的最大公约数和最小公倍数的题目.给你两个数字g,l,分别表示最大公约数和最小公倍数.要求你找到两个数a,b,要求这两个数的最大公约数和最小公倍数为所给的两个数.如果存在多组数字符合这一条件, 就输出a最小的那一组数字.由最大公约数和最小公倍数与两个数的关系可得,a*b=l*g,g<=a,b<=l,a%g==b%g==0,l%a==l%b==0.则所要求的a最小的那组数据,其实就是当a==g时所求出的那组数据. #include <stdio.h> #include