您的位置:首页 > 其它

UVA 11388 (唯一分解 水~)

2016-06-07 15:30 288 查看
题意:求使得lcm(A,B)=C的最小的B.

如果把A分解成A=p1^a1 * p2^a1 * p3^a3 *...*pn^an, 

C = q1^b1 * q2^b2 *...*qm^bm,然后就只需要考虑C的每一个因子是能不能全部

由A提供就好了.

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <map>
#include <set>
#include <vector>
#include <queue>
using namespace std;
#define maxn 1111111

long long a, b, c;
bool is_prime[maxn];
int prime[maxn], cnt;

void init () {
cnt = 0;
memset (is_prime, 1, sizeof is_prime);
is_prime[0] = is_prime[1] = 0;
for (int i = 2; i < maxn; i++) {
if (is_prime[i]) {
prime[cnt++] = i;
for (int j = i+i; j < maxn; j += i)
is_prime[j] = 0;
}
}
}

void solve () {
long long k = c;
b = 1;
for (int i = 0; prime[i]*prime[i] <= a; i++) {
int num1, num2;
if (a%prime[i] == 0) {
num1 = num2 = 0;
while (a%prime[i] == 0) {
num1++;
a /= prime[i];
}
while (k%prime[i] == 0) {
num2++;
k /= prime[i];
}
if (num2 > num1) {
b *= pow (prime[i], num2);
}
}
}
int num = 0;
while (a > 1 && k%a == 0) {
k /= a;
num++;
}
if (num > 1) b *= pow (a, num);
b *= k;
printf ("%lld\n", b);
}

int main () {
init ();
int t;
scanf ("%d", &t);
while (t--) {
scanf ("%lld%lld", &a, &c);
if (c%a != 0) {
printf ("NO SOLUTION\n");
continue;
}
solve ();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: