题意
给一个A一个C,求最小的B,
满足A和B的最小公倍数是C。
思路来源
自己的脑洞
题解
AC了之后看了看网上的题解
感觉比较沙雕
还是自己总结一发吧
先令B=C/A,注意到C=A*B/gcd(A,B)
如果gcd(A,B)=1,那么B显然即为所求,
如果gcd(A,B)不为1,不断地,令A/=gcd(A,B),再去令B=C/A,
判断A和B是否互质,互质输出B即可。
代码
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <set>
#include <map>
#include <vector>
#include <stack>
#include <queue>
#include <functional>
const int INF=0x3f3f3f3f;
const int maxn=1e4;
const int mod=1e9+7;
const int MOD=998244353;
const double eps=1e-7;
typedef long long ll;
#define vi vector<int>
#define si set<int>
#define pii pair<int,int>
#define pi acos(-1.0)
#define pb push_back
#define mp make_pair
#define lowbit(x) (x&(-x))
#define sci(x) scanf("%d",&(x))
#define scll(x) scanf("%lld",&(x))
#define sclf(x) scanf("%lf",&(x))
#define pri(x) printf("%d",(x))
#define rep(i,j,k) for(int i=j;i<=k;++i)
#define per(i,j,k) for(int i=j;i>=k;--i)
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
ll gcd(ll a,ll b)
{
return b?gcd(b,a%b):a;
}
int main()
{
int t;
sci(t);
while(t--)
{
int a,b,c,d;
sci(a),sci(b);
if(b%a)
{
puts("NO SOLUTION");
continue;
}
c=b/a;
while((d=gcd(a,c))!=1)
{
a/=d;
c*=d;
}
printf("%d\n",c);
}
return 0;
}