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其实是想拒绝他的,但是找不到好的说辞,于是提出了这样的要 ...
随机推荐
- Sentinel-Redis高可用方案(二):主从切换
Redis 2.8版开始正式提供名为Sentinel的主从切换方案,Sentinel用于管理多个Redis服务器实例,主要负责三个方面的任务: 1. 监控(Monitoring): Senti ...
- vs2012 发布网站,
如图这样选择就没有可以得到一个不包括 *.aspx.cs 的网站了.
- ios8调用相机报警告: Snapshotting a view that has not been rendered results in an empty snapshot. Ensure you(转)
我这也报了这个警告,但按他的方法并没有起作用,把写到这个地方看是否其他人用的到 错误代码:Snapshotting a view that has not been rendered results ...
- oracle修改表字段
--添加字段 )); -- 修改字段的长度- ));
- 【POJ 1113】Wall
http://poj.org/problem?id=1113 夏令营讲课时的求凸包例题,据说是PKUSC2015的一道题 我WA两次错在四舍五入上了(=゚ω゚)ノ #include<cmath& ...
- WEB界面onload前的加载流程❤❤
开始的流程: 1.先发请求给DNS进行域名解析获取服务器IP 2.向步骤1获取的服务器IP发送HTTP请求 //服务器的内部处理 3.服务器接收请求后,解析主机头对应的站点,把请求传送给站点 //返回 ...
- 概率 light oj 1104
t个数据 n天一年 至少2个人在同一天生日的概率>=0.5 问至少多少人 显然要从反面考虑 设365天 都在不同一天的概率 p(num)=1*364/365*363/365...; =(day ...
- LightOJ 1341 唯一分解定理
Aladdin and the Flying Carpet Time Limit:3000MS Memory Limit:32768KB 64bit IO Format:%lld &a ...
- Thinking in java学习笔记之初始化
1.基本数据类型:类的每个基本数据类型保证有一个初值(char为0输出则是空白) 2.构造器: 3.静态初始化顺序示例及总结 4.非静态初始化顺序 4.数组
- [vijos1982][NOIP2015]子串
Description 有两个仅包含小写英文字母的字符串和.现在要从字符串中取出个互不重叠的非空子串,然后把这个子串按照其在字符串中出现的顺序依次连接起来得到一个新的字符串,请问有多少种方案可以使得这 ...