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 ...
随机推荐
- 解决Cannot change version of project facet Dynamic web module to 2.5
我们用Eclipse创建Maven结构的web项目的时候选择了Artifact Id为maven-artchetype-webapp,由于这个catalog比较老,用的servlet还是2.3的,而一 ...
- MFC下debug改成release版本出现问题及解决办法
自己在debug下成功运行了自己写的测试自己写第三方库的程序,这里有用到opencv库,所以同时用到了自己的库和opencv的库,需求因为要进行速度的测试,是想要把debug改成release版本,这 ...
- 我的开发框架之ORM框架
今天我想分享一下我自己的ORM框架,虽然谈不是很好,但我个人认为还是蛮好用的,跟大家分享交流一下. 首先说说我对现在主流的ORM框架的一些看法: 优点: 让程序员不再关注数据库细节,专心在业务逻辑上, ...
- ASP.NET文件上传大小的限制解决方案
我们大家都知道ASP.NET为我们提供了文件上传服务器控件FileUpload,默认情况下可上传的最大文件为4M,如果要改变可上传文件大小限制,那么我们可以在web.config中的httpRunti ...
- python基础--基本数据类型考试_day3
1.执行 Python 脚本的两种方式 终端和交互模式 法1:python helloword.py 法2:ps: 执行前需给预chmod 755 helloword.py (linux系统中)./h ...
- 【Alpha版本】项目测试
我说的都队 031402304 陈燊 031402342 许玲玲 031402337 胡心颖 03140241 王婷婷 031402203 陈齐民 031402209 黄伟炜 031402233 郑扬 ...
- MyBatis学习--SqlMapConfig.xml配置文件
简介 SqlMapConfig.xml是MyBatis的全局配置文件,在前面的文章中我们可以看出,在SqlMapConfig.xml主要是配置了数据源.事务和映射文件,其实在SqlMapConfig. ...
- ES6新特性:Javascript中的Map和WeakMap对象
Map对象 Map对象是一种有对应 键/值 对的对象, JS的Object也是 键/值 对的对象 : ES6中Map相对于Object对象有几个区别: 1:Object对象有原型, 也就是说他有默认的 ...
- CSS3动画属性之Animation
首先定义一个动画规则: @keyframes mymove { from {top:0px;} to {top:200px;} } @-moz-keyframes mymove /* Firefox ...
- lucene-查询query->RangeQuery在某一范围内搜索
有时用户会需要一种在一个范围内查找某个文档,比如查找某一时间段内的所有文档,此时,Lucene提供了一种名为RangeQuery的类来满足这种需求. RangeQuery表示在某范围内的搜索条件,实现 ...