Codeforces 711E ZS and The Birthday Paradox
传送门
time limit per test 2 seconds
memory limit per test 256 megabytes
input standard input
output standard output
ZS the Coder has recently found an interesting concept called the Birthday Paradox. It states that given a random set of $23$ people, there is around $50%$ chance that some two of them share the same birthday. ZS the Coder finds this very interesting, and decides to test this with the inhabitants of Udayland.
In Udayland, there are $2^n$ days in a year. ZS the Coder wants to interview $k$ people from Udayland, each of them has birthday in one of $2^n$ days (each day with equal probability). He is interested in the probability of at least two of them have the birthday at the same day.
ZS the Coder knows that the answer can be written as an irreducible fraction $\dfrac{A}{B}$. He wants to find the values of $A$ and $B$ (he does not like to deal with floating point numbers). Can you help him?
Input
The first and only line of the input contains two integers $n$ and $k$ ($1 \le n \le 10^18, 2 \le k \le 10^18$), meaning that there are $2^n$ days in a year and that ZS the Coder wants to interview exactly $k$ people.
Output
If the probability of at least two $k$ people having the same birthday in $2^n$ days long year equals ($A \ge 0, B \ge 1, \gcd(A,B)=1$), print the $A$ and $B$ in a single line.
Since these numbers may be too large, print them modulo $10^6 + 3$. Note that $A$ and $B$ must be coprime before their remainders modulo $10^6 + 3$ are taken.
Examples
Input
3 2
Output
1 8
Input
1 3
Output
1 1
Input
4 3
Output
23 128
Note
In the first sample case, there are $2^3 = 8$ days in Udayland. The probability that $2$ people have the same birthday among $2$ people is clearly $\frac{1}{8}$ , so $A = 1, B = 8$.
In the second sample case, there are only $2^1 = 2$ days in Udayland, but there are $3$ people, so it is guaranteed that two of them have the same birthday. Thus, the probability is $1$ and $A = B = 1$.
Solution
首先注意到$10^6+3$是个素数.
不难想到求任意两人生日都不冲突的概率更为简单, 答案是$\dfrac{A_{2n}{k}}{2^{nk}}$, 展开化简得
$$ \frac{(2n-1)(2n-2)\cdots(2n-(k-1))}{2{n(k-1)}} $$
这里我们需要注意:
$$\dfrac{a}{b}既约\Longleftrightarrow \dfrac{a}{b-a}既约,\ (b>a)$$
因为$\gcd(a, b)=\gcd(a, b-a)$.
接着要对此式进行约分, 也就是求分子的素因子分解形式中2的幂次. 这里有个key observation:
$$2^n-x中2的幂次和x中2的幂次相同.$$
所以问题转化成求$(k-1)!$中所包含的2的幂次.
而$n!$中包含的素数$p$的幂次, 记作$\nu_p(n!)$, 为:
$$\nu_p(n!)=\sum_{i\ge 1}[\frac{n}{p^i}]$$
上式也称作Legendre's formula.
注意: 如果$p$不是素数, 这个结论是不成立的.
Implementation
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
// return the max k s.t. p^k | n!
LL get_exponent(LL n, int p){
LL res=0;
for(LL x=p; n>=x; res+=n/x, x*=p);
return res;
}
LL Pow(LL x, LL n, int p){
LL res=1;
for(; n; x*=x, x%=p, n>>=1)
if(n&1) res*=x, res%=p;
return res;
}
// return 2^{(k-1)*n}
LL calc2(LL n, LL k, int p){
return Pow(Pow(2, k-1, p), n, p);
}
// x cannot be divided by p
LL inv(LL x, int p){
return Pow(x, p-2, p);
}
// A(n, k)%p, p is small
// n>=k
LL calc3(LL n, LL k, int p){
if(k>=p) return 0;
LL res=1;
for(; k; ){
res*=n, res%=p;
if(n==0) break;
--k, --n;
}
return res;
}
int main(){
LL n, k;
cin>>n>>k;
int p=1000003;
if(log2(k)>n){
puts("1 1");
}
else{
LL cnt=get_exponent(k-1, 2); //error-prone
LL x=Pow(2, cnt, p);
LL y=(Pow(2, n, p)+p-1)%p;
LL t=inv(x, p);
LL num=calc3(y, k-1, p)*t%p;
LL den=calc2(n, k, p)*t%p;
num=(den-num+p)%p; //error-prone
cout<<num<<' '<<den<<endl;
}
}
Pitfalls
最近写代码总是犯各种各样的傻逼错误. 比如这次我把函数calc2()
中的return Pow(Pow(2, k-1, p), n, p);
写成了Pow(Pow(2, k-1, p), n, p);
. 这样在本地竟然把3个样例都过了. 然后交上去竟然WA on T1.
历尽千辛万苦才找到bug. 我的编译器(g++ 5.4.0)没报错, 可能是自动识别了这个错误. 避免这个问题的方法是编译时加上-Wall
选项.
g++ main.cpp -o main -Wall -std=c++14 && ./main <in
Codeforces 711E ZS and The Birthday Paradox的更多相关文章
- Codeforces 711E ZS and The Birthday Paradox 数学
ZS and The Birthday Paradox 感觉里面有好多技巧.. #include<bits/stdc++.h> #define LL long long #define f ...
- Codeforces 711E ZS and The Birthday Paradox(乘法逆元)
[题目链接] http://codeforces.com/problemset/problem/711/E [题目大意] 假设一年有2^n天,问k个小朋友中有两个小朋友生日相同的概率. 假设该概率约分 ...
- codeforces 711E. ZS and The Birthday Paradox 概率
已知一年365天找23个人有2个人在同一天生日的概率 > 50% 给出n,k ,表示现在一年有2^n天,找k个人,有2个人在同一天生日的概率,求出来的概率是a/b形式,化到最简形式,由于a,b可 ...
- codeforces 711E E. ZS and The Birthday Paradox(数学+概率)
题目链接: E. ZS and The Birthday Paradox. time limit per test 2 seconds memory limit per test 256 megaby ...
- Codeforces Round #369 (Div. 2) E. ZS and The Birthday Paradox 数学
E. ZS and The Birthday Paradox 题目连接: http://www.codeforces.com/contest/711/problem/E Description ZS ...
- ZS and The Birthday Paradox
ZS and The Birthday Paradox 题目链接:http://codeforces.com/contest/711/problem/E 数学题(Legendre's formula) ...
- CF369E. ZS and The Birthday Paradox
/* cf369E. ZS and The Birthday Paradox http://codeforces.com/contest/711/problem/E 抽屉原理+快速幂+逆元+勒让德定理 ...
- 【Codeforces711E】ZS and The Birthday Paradox [数论]
ZS and The Birthday Paradox Time Limit: 20 Sec Memory Limit: 512 MB Description Input Output Sample ...
- 【28.57%】【codeforces 711E】ZS and The Birthday Paradox
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
随机推荐
- [MetaHook] SearchPattern function
By Nagi void *SearchPattern(void *pStartSearch, DWORD dwSearchLen, char *pPattern, DWORD dwPatternLe ...
- #CSDN刷票门# 有没有人在恶意刷票?CSDN请告诉我!用24小时监控数据说话!
特别声明: 此次并非针对其他参与2013中国十大优秀开源项目的同行,体系有漏洞要谴责的是制定规则并从中获益但不作为的权贵,草根们制定不了规则但可发现和利用漏洞,这是程序员应有反叛精神没错.但被作为道具 ...
- 从大公司做.NET 开发跳槽后来到小公司的做.NET移动端微信开发的个人感慨
从14年11月的实习到正式的工作的工作我在上一家公司工作一年多了.然而到16年5月20跳槽后自己已经好久都没有在写博客了,在加上回学校毕业答辩3天以及拿档案中途耽搁了几天的时间,跳槽后虽然每天都在不停 ...
- 制作鼠标移动到div上面显示弹出框
<div class="show-dialog hide"> <header> <div class="note"> < ...
- 【开源】LLMAnimator 60多种动画让你的应用动起来
github: https://github.com/brookshi/LLMAnimator ,欢迎star/fork 之前做android的时候需要给应用加些动画效果,在github上找到这个库 ...
- 使用Spring Sleuth和Zipkin跟踪微服务
随着微服务数量不断增长,需要跟踪一个请求从一个微服务到下一个微服务的传播过程, Spring Cloud Sleuth 正是解决这个问题,它在日志中引入唯一ID,以保证微服务调用之间的一致性,这样你就 ...
- 怎样关闭google的自动更新
谷歌的自动更新很烦人的,只要你点击关于Google Chrome,谷歌就会自动更新成最新版本. 但是sencha框架好像与谷歌29.0以上的兼容性不是很好,所以关闭谷歌自动更新的需求来了,网上很多人说 ...
- [HDU5902]GCD is Funny(xjb搞)
题意:n个数每次选三个数删除,取其中两个数将gcd放回去两次,问最后剩的数可能是多少 分析:考虑最优情况: 先拿出三个数,留下两个x,x 再来一个y,(x,x,y)我们可以删去一个x,留下两个gcd ...
- MEF
详情见链接:http://www.cnblogs.com/comsokey/p/MEF1.html#top
- 阿里巴巴高新能数据源com.alibaba.druid.pool.DruidDataSource的jar包配置
aspectjweaver-1.7.4.jar druid-0.2.9.jar 两个包,用于提供com.alibaba.druid.pool.DruidDataSource