链接:http://acm.hust.edu.cn/vjudge/problem/25715/origin
题目:有三个正整数a,b,c(0<a,b,c<10^6),其中c不等于b。若a和c的最大公约数为b,现已知a和b,求满足条件的最小的c。
题意:。
题解:
题目:有三个正整数a,b,c(0<a,b,c<10^6),其中c不等于b。若a和c的最大公约数为b,现已知a和b,求满足条件的最小的c。
题意:。
分析:数据不是很大,其实可以从2*b开始枚举,用gcd(辗转相除)的快捷方法验证的
(图转,侵删。。)
我用了比较笨的方法:把a和b分解质因数,再从a中把b的质因数剔除出去,然后开始从小枚举选择c除去b的质因数(只要不出现在a的剩余质因数中就可以),结果就是b*这个质因数。
题解:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <cstring>
#include <functional>
#include <cmath>
using namespace std;
int prime[2000];
int pa[2000],na;
int pb[2000],nb;
int kk;
void getprime()
{
int k=1;
prime[0]=2;
for(int i=3;i<10000;i+=2)
{
int j;
for(j=0;j<k;j++)
if(i%prime[j]==0)
break;
if(j==k)
{
prime[k]=i;
k++;
kk=k;
//cout<<i<<' '<<k<<endl;
}
}
}
void solve(int m,int* s,int* n)
{
int i=0;
while(m!=1&&i<kk)
{
while(m%prime[i]==0)
{
m/=prime[i];
s[i]++;
}
i++;
}
*n=i;
}
int main()
{
//freopen("in.txt","r",stdin);
getprime();
int n,a,b;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int c=1;
memset(pa,0,sizeof(pa));
memset(pb,0,sizeof(pb));
cin>>a>>b;
solve(a,pa,&na);
solve(b,pb,&nb);
int minn=(na<nb)?na:nb;
for(int j=0;j<minn;j++)
{
pa[j]-=pb[j];
if(pb[j]!=0)
c*=pow(prime[j],pb[j]);
}
for(int l=0;l<na;l++)
if(pa[l]==0)
{
c*=prime[l];
break;
}
cout<<c<<endl;
}
return 0;
}