题目描述
【问题描述】
小明有两个正整数
需要帮小明找到
【输入格式】
一行两个正整数
【输出格式】
输出两个数, 用一个空格隔开。第一个数表示
【样例输入1】
5 8
【样例输出1】
2 4
【样例解释1】
注意
【样例输入2】
20 4
【样例输出2】
4 2
【样例解释2】
注意
【数据规模和约定】
对于10%的数据,
对于40%的数据,
对于100%的数据,
算法
思路
首先,
根据算数基本定理,
所以,
很明显,
最后, 绝对绝对不能忘记该题的数据范围,
代码实现
cpp
#include <iostream>
#include <cmath>
#define max(a, b) (a)>(b)?(a):(b)
using namespace std;
typedef long long ll;
const int N = 1e6+5;
ll a, b;
ll primes[N], c[N], cnt;
void divide_primes(ll x, ll y){ //分解质因数
for(int i=2;i<=max(x, y)/i;i++){
if(x%i==0||y%i==0){
primes[++cnt] = i;
while(x%i==0){
c[cnt] ++;
x/=i;
}
while(y%i==0){
c[cnt] ++;
y/=i;
}
}
}
if(x>1){
primes[++cnt] = x;
c[cnt] ++;
}
if(y>1){
if(x!=y) {
primes[++cnt] = y;
}
c[cnt] ++;
}
}
int main(){
cin>>a>>b;
divide_primes(a, b);
unsigned long long g = 1, ans = 1;
for(int i=1;i<=cnt;i++){
if(c[i]%2) ans = ans * 2; //次数为奇数时有两种选择
for(int j=0;j<c[i]/2;j++){
g = g*primes[i];
}
}
cout<<g<<' '<<ans;
return 0;
}