给出a,c 求出最小的b .
利用质因数分解的思想拆开a和c的因子,然后凑出b
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e4+5;
int prime[maxn],len=0;
bool vis[maxn];
void pri()
{
for(int i=2; i<maxn; i++)
{
if(!vis[i]) prime[len++]=i;
for(int j=0; j<len&&i*prime[j]<maxn; j++)
{
vis[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
}
int main()
{
pri();
int t;
scanf("%d",&t);
while(t--)
{
int a,c;
scanf("%d%d",&a,&c);
if(c%a) printf("NO SOLUTION\n");
else
{
int en=sqrt(a+0.5),ans=1;
for(int i=0; i<len&&prime[i]<=en; i++)
{
int cou1=0,cou2=0;
while(c%prime[i]==0)
{
c/=prime[i];
ans*=prime[i];
cou1++;
}
while(a%prime[i]==0)
{
a/=prime[i];
cou2++;
}
if(cou2==cou1)
{
while(cou2--)
{
ans/=prime[i];
}
}
}
int cou1=0;
if(a>1) while(c%a==0)
{
cou1++;
c/=a;
ans*=a;
}
if(cou1==1) ans/=a;
ans*=c;
printf("%d\n",ans);
}
}
return 0;
}
a=p1^e1*p2^e2...
b=p1^k1*p2^k2..
假设e1>k1,k2>e2.
c=p1^(max(e1,k1))*p2^(max(k2,e2))...
c/a=p1^(e1-k1) * p2^(k2-e2)
e1>k1 那么b中就的k1取0. 因为对lcm无影响同时做到最小.
k2-e2 我们要求出b就要+回一个e2.但是 可能 k2-e2<e2 ,g=gcd(c/a,a)=p2^(k2-e2). c/a*g<b;
所以我们不能一步到位求出b。这个时候我们可以减小a中p2的次幂,加到b中。直到两个数互质
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <algorithm>
using namespace std;
typedef long long ll;
int gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int a,c;
scanf("%d%d",&a,&c);
if(c%a) printf("NO SOLUTION\n");
else
{
int ans=c/a,g=gcd(a,ans);
while(g!=1)
{
ans*=g;
a/=g;
g=gcd(ans,a);
}
printf("%d\n",ans);
}
}
}