机会渺茫Time Limit:5000MS Memory Limit:262144KB 64bit IO Format:%lld & %llu
Description
小Hi最近在追求一名学数学的女生小Z。小Z其实是想拒绝他的,但是找不到好的说辞,于是提出了这样的要求:对于给定的两个正整数N和M,小Hi随机选取一个N的约数N',小Z随机选取一个M的约数M',如果N'和M'相等,她就答应小Hi。
小Z让小Hi去编写这个随机程序,到时候她review过没有问题了就可以抽签了。但是小Hi写着写着,却越来越觉得机会渺茫。那么问题来了,小Hi能够追到小Z的几率是多少呢?
Input
每个输入文件仅包含单组测试数据。
每组测试数据的第一行为两个正整数N和M,意义如前文所述。
对于40%的数据,满足1<=N,M<=106
对于100%的数据,满足1<=N,M<=1012
Output
对于每组测试数据,输出两个互质的正整数A和B(以A分之B表示小Hi能够追到小Z的几率)。
Sample Input
3 2
Sample Output
4 1 求出两个数的约数个数x,y,再求出两个数最大公约数的约数个数z,再求x*y与z的最大公约数,两边同除即可约分至最简比
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<queue>
#include<vector>
#define PI acos(-1.0)
#define INF 0x3f3f3f3f
#define CL(a, b) memset(a, b, sizeof(a))
using namespace std;
typedef long long LL;
const int maxn = 2e3+10;
const int MOD = 1e9+7;
LL gcd(LL a, LL b){
return b ? gcd(b, a%b) : a;
}
LL Get_num(LL a){
LL ans = 0;
for(LL i = 1; i*i <= a; i++){
if(a%i == 0){
if(i*i == a) ans++;
else ans += 2;
}
}
return ans;
}
int main(){
LL a, b, c;
scanf("%lld%lld", &a, &b);
c = gcd(a, b);
LL x, y, z;
x = Get_num(a);
y = Get_num(b);
z = Get_num(c);
LL cnt = gcd(x*y, z);
printf("%lld %lld\n", (x*y)/cnt, z/cnt);
return 0;
}