题目链接

#1284 : 机会渺茫

时间限制:5000ms
单点时限:1000ms
内存限制:256MB

描述

小Hi最近在追求一名学数学的女生小Z。小Z其实是想拒绝他的,但是找不到好的说辞,于是提出了这样的要求:对于给定的两个正整数N和M,小Hi随机选取一个N的约数N',小Z随机选取一个M的约数M',如果N'和M'相等,她就答应小Hi。

小Z让小Hi去编写这个随机程序,到时候她review过没有问题了就可以抽签了。但是小Hi写着写着,却越来越觉得机会渺茫。那么问题来了,小Hi能够追到小Z的几率是多少呢?

输入

每个输入文件仅包含单组测试数据。

每组测试数据的第一行为两个正整数N和M,意义如前文所述。

对于40%的数据,满足1<=N,M<=10^6

对于100%的数据,满足1<=N,M<=10^12

输出

对于每组测试数据,输出两个互质的正整数A和B(以A分之B表示小Hi能够追到小Z的几率)。

样例输入
3 2
样例输出
4 1

分析:对 n 和 m 分解,得到n和m的每一个素数的指数en[],em[],然后取公约数,即取每个指数小的那个得到新的 et[], sum(et[]) / sum(en[]) * sum(em[])即所求,就是在en里面找一个,在em里面找一个,1/(sum[en] * sum[em]),一共有sum[et]个
题目等级为2,然后我却WA了好几次,RE了好几次 =_=...
 #include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long LL;
const int Max = + ; //开到6次RE
bool flag[Max + ];
int prime[Max + ], tot;
int en[Max + ], em[Max + ], et[Max + ];
void get_prime()
{
memset(flag, false, sizeof(flag));
tot = ;
for (int i = ; i <= Max;i ++)
{
if (!flag[i])
{
prime[++tot] = i;
for (int j = i; j <= Max / i; j++)
flag[i * j] = true;
}
}
}
void get_fact(LL n, int * temp)
{
memset(temp, , sizeof(temp));
for (int i = ; i <= tot; i++)
{
if (prime[i] > n)
break;
if (n % prime[i] == )
{
while (n % prime[i] == )
{
n = n / prime[i];
temp[prime[i]]++;
}
}
}
if (n > )
temp[n]++;
}
LL get_sum(int temp[])
{
LL sum = ;
for (int i = ; i <= tot; i++)
{
if (temp[prime[i]])
sum *= (temp[prime[i]] + );
}
return sum;
}
void solve()
{
memset(et, , sizeof(et));
for (int i = ; i <= tot; i++)
{
if (en[prime[i]] && em[prime[i]])
{
int minn = min (en[prime[i]], em[prime[i]]); //取最小的指数
et[prime[i]] += minn;
}
}
}
LL get_gcd(LL a, LL b)
{
if (b == )
return a;
return get_gcd(b, a % b);
}
int main()
{
get_prime();
LL n, m;
scanf("%lld%lld", &n, &m);
get_fact(n, en);
get_fact(m, em);
solve();
LL numn = get_sum(en);
LL numm = get_sum(em);
LL numf = get_sum(et); // 最后结果就是 numf / (numn * numm)
所以先对numf 和 numn约分,
然后把约分后的numf与numm约分,最后numn * numm
LL x1 = numf;
LL t1 = get_gcd(numn, numf);
x1 = x1 / t1;
numn = numn / t1; LL t2 = get_gcd(numm, x1);
x1 = x1 / t2;
numm = numm / t2;
numn = numn * numm; printf("%lld %lld\n", numn, x1);
return ;
}

hihoCoder1284机会渺茫(唯一分解定理 + 约分)的更多相关文章

  1. hihocoder-1284 机会渺茫(水题)

    机会渺茫 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi最近在追求一名学数学的女生小Z.小Z其实是想拒绝他的,但是找不到好的说辞,于是提出了这样的要求:对于给定的两 ...

  2. UVa10375:选择与除法(唯一分解定理)

    The binomial coefficient C(m,n) is defined as Given four natural numbers p, q, r, and s, compute the th ...

  3. NOIP2009Hankson 的趣味题[唯一分解定理|暴力]

    题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫 Hankson.现 在,刚刚放学回家的 Hankson 正在思考一个有趣的问题. 今天在课堂上,老师讲 ...

  4. UVA - 10375 Choose and divide[唯一分解定理]

    UVA - 10375 Choose and divide Choose and divide Time Limit: 1000MS   Memory Limit: 65536K Total Subm ...

  5. uva10375 Choose and Divide(唯一分解定理)

    uva10375 Choose and Divide(唯一分解定理) 题意: 已知C(m,n)=m! / (n!*(m-n!)),输入整数p,q,r,s(p>=q,r>=s,p,q,r,s ...

  6. 1341 - Aladdin and the Flying Carpet ---light oj (唯一分解定理+素数筛选)

    http://lightoj.com/volume_showproblem.php?problem=1341 题目大意: 给你矩形的面积(矩形的边长都是正整数),让你求最小的边大于等于b的矩形的个数. ...

  7. UVA 10375 Choose and divide【唯一分解定理】

    题意:求C(p,q)/C(r,s),4个数均小于10000,答案不大于10^8 思路:根据答案的范围猜测,不需要使用高精度.根据唯一分解定理,每一个数都可以分解成若干素数相乘.先求出10000以内的所 ...

  8. 唯一分解定理 poj 1365

    一行代表一个数 x 给你底数和指数 求x-1的唯一分解定理的底数和指数 从大到小输出 #include<stdio.h> #include<string.h> #include ...

  9. hiho #1284 机会渺茫

    #1284 : 机会渺茫 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi最近在追求一名学数学的女生小Z.小Z其实是想拒绝他的,但是找不到好的说辞,于是提出了这样的要 ...

随机推荐

  1. 记、基于react-router的单页应用

    现在用react写单页应用基本上都是用react-router做前端路由了吧!最近在使用react-router的过程中遇到了不少问题,在这里总结一下. 浏览器url react-router默认提供 ...

  2. SSH登录之后运行命令报错的解决办法-- Failed to connect to Mir: Failed to connect to server socket: No such file or directory

    问题描述: Failed to connect to Mir: Failed to connect to server socket: No such file or directory 解决方案: ...

  3. JSON字符串——后台解析系列

    以前我们都是讲JSON字符串获取后,在前台进行展示.今天小编就交给大家后台解析展示数据的方法.非常方便,就以下代码: JObject obj = JObject.Parse(data); string ...

  4. Position、Float

    http://www.cnblogs.com/coffeedeveloper/p/3145790.html

  5. Dll的显式和隐式调用

    建立项目,请选择Win32 控制台项目(Win32 Console Application),选择DLL和空项目选项.DLLs可能并不如你想像的那样难.首先写你的头文件(header file):称为 ...

  6. JavaIO流文件的操作总结

    IO流的分类 1.根据数据的流向: 输入流:用来读数据,如从外界设备读数据到内存中: 输出流:用来写数据,如从内存输出数据到外界存储设备: 2.根据数据流的格式: 字节流:一般用于声音或者秃瓢等二进制 ...

  7. [转] EJB到底是什么,真的那么神秘吗??

    原文地址:http://blog.csdn.net/jojo52013145/article/details/5783677 1. 我们不禁要问,什么是"服务集群"?什么是&quo ...

  8. hdu1521 指数型母函数

    排列组合 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  9. 【HDU 2874】Connections between cities(LCA)

    dfs找出所有节点所在树及到树根的距离及深度及父亲. i和j在一棵树上,则最短路为dis[i]+dis[j]-dis[LCA(i,j)]*2. #include <cstring> #in ...

  10. Ajax 密码验证

    var names = $("names");var pwds = $("pwds");var ts1 = $("ts1");var ts2 ...