hihoCoder1284机会渺茫(唯一分解定理 + 约分)
题目链接
#1284 : 机会渺茫
描述
小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机会渺茫(唯一分解定理 + 约分)的更多相关文章
- hihocoder-1284 机会渺茫(水题)
机会渺茫 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi最近在追求一名学数学的女生小Z.小Z其实是想拒绝他的,但是找不到好的说辞,于是提出了这样的要求:对于给定的两 ...
- UVa10375:选择与除法(唯一分解定理)
The binomial coefficient C(m,n) is defined as Given four natural numbers p, q, r, and s, compute the th ...
- NOIP2009Hankson 的趣味题[唯一分解定理|暴力]
题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫 Hankson.现 在,刚刚放学回家的 Hankson 正在思考一个有趣的问题. 今天在课堂上,老师讲 ...
- UVA - 10375 Choose and divide[唯一分解定理]
UVA - 10375 Choose and divide Choose and divide Time Limit: 1000MS Memory Limit: 65536K Total Subm ...
- 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 ...
- 1341 - Aladdin and the Flying Carpet ---light oj (唯一分解定理+素数筛选)
http://lightoj.com/volume_showproblem.php?problem=1341 题目大意: 给你矩形的面积(矩形的边长都是正整数),让你求最小的边大于等于b的矩形的个数. ...
- UVA 10375 Choose and divide【唯一分解定理】
题意:求C(p,q)/C(r,s),4个数均小于10000,答案不大于10^8 思路:根据答案的范围猜测,不需要使用高精度.根据唯一分解定理,每一个数都可以分解成若干素数相乘.先求出10000以内的所 ...
- 唯一分解定理 poj 1365
一行代表一个数 x 给你底数和指数 求x-1的唯一分解定理的底数和指数 从大到小输出 #include<stdio.h> #include<string.h> #include ...
- hiho #1284 机会渺茫
#1284 : 机会渺茫 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi最近在追求一名学数学的女生小Z.小Z其实是想拒绝他的,但是找不到好的说辞,于是提出了这样的要 ...
随机推荐
- OS存储器管理(一)
存储器的层次: 分为寄存器.主存(内存)和 辅存(外存)三个层次. 主存:高速缓冲存储器.主存储器.磁盘缓冲存储器, 主存又称为可执行存储器: 辅存:固定磁盘存储器.可移动的外部存储器: 其可长期保存 ...
- js如何判断一个数组
typeof [] 为一个"object" 不能通过此方法判断一个数组 方法 1.instanceof方法,这个方法用的比较多. 2.这个是es5以后推荐的方法,Object.pr ...
- 半平面交模板(BZOJ1007)
#include<cstdio> #include<algorithm> #define LDB long double using namespace std; ]; str ...
- 曼慧尼特u检验(两个样本数据间有无差异)
曼-惠特尼U检验(Mann-Whitney检验) How the Mann-Whitney test works Mann-Whitney检验又叫做秩和检验,是比较没有配对的两个独立样本的非参数检验. ...
- poj-1314 Finding Rectangles
题目地址: http://poj.org/problem?id=1314 题意: 给出一串的点,有些点可以构成正方形,请按照字符排序输出. 因为这道题的用处很大, 最近接触的cv 中的Rectangl ...
- 使用iframe标签结合springMvc做文件上传
1.iframe.jsp <body> <h1>测试iframe文件上传</h1> <!-- 1.要求表单的target属性名称与iframe的name名字一 ...
- Socket,TCP/IP,UDP,HTTP,FTP
1.Socket:套接字,是传输层协议的一种编程API 作用:用于描述IP地址和端口,区分来自不同应用程序的通信,实现数据传输的并发服务 JDK Socket:在java.net包下有两个类Sock ...
- zabbix 监控MySQL
现在我来说一下我的监控环境 zabbix-3.0.3 MySQL-5.6.23 1.首先我们要登录MySQL,创建一个监控MySQL的用户 GRANT USAGE,PROCESS,SUPER,REPL ...
- [转] java中int,char,string三种类型的相互转换
原文地址:http://blog.csdn.net/lisa0220/article/details/6649707 如何将字串 String 转换成整数 int? int i = Integer.v ...
- git 常用命令使用
1. 初始化仓库 git init 2. 查看当前状态 git status(1)Changes not staged for commit:(2)Changes to be committed: 3 ...