问题描述
两仪剑法是武当派武功的高级功夫,且必须 2 个人配合使用威力才大。同时该剑法招数变化太快、太多。设武当弟子甲招数变化周期为 n,武当弟子乙招数变化周期为 m,两弟子同时使用该剑法,当 2 人恰好同时达到招数变化周期结束时,威力最大,此时能将邪教妖人置于死地。请你计算威力最大时,每人用了多少招?
输入格式
首先输入一个 t(t<100000) 表示测试组数。
接下来 t组输入,每组输入 2 个数n,m(1≤n,m≤1000000000)。
输出格式
对于每组输出,输出用了多少招数。
样例输入
3
2 3
8 9
4 8
样例输出
6
72
8
注意:输入输出一定要用scanf和printf,否则两个都会超时
方法一:欧几里得算法
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b)
{
if(b==0)
{
return a;
}
return gcd(b,a%b);
}
int main()
{
ll t,n,m,nn,mm;
scanf("%lld",&t);
while(t--)
{
scanf("%lld %lld",&n,&m);
nn=max(n,m);
mm=min(n,m);
ll x=gcd(nn,mm);
ll res=(nn/x)*(mm);
printf("%lld\n",res);
}
return 0;
}
/*
3
2 3
8 9
4 8
*/
方法二:辗转相减法
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
//辗转相减法,求最大公约数
ll cnt(ll a,ll b)
{
while(a!=b)
{
if(a>b)
{
a=a-b;
}
else
{
b=b-a;
}
}
return a;
}
int main()
{
ll t,n,m;
cin>>t;
while(t--)
{
scanf("%lld %lld",&n,&m);
printf("%lld\n",n*m/cnt(n,m));
}
return 0;
}