引理:

勒让德定理 :http://baike.baidu.com/link?url=mqSXfFsk18D6zM7C1IVMh11M-3PaDRwCzqnB2ThJFymE98UuTGjmStD_uyEiPUb3Fw7QihFVfZaFeGo8kCkSMK

在正数n!的素因子标准分解式中,素数p的指数记作

 

,则

 

.

证明百科上面也有:
这个似乎很好理解啊。。。。n/2,代表1到n里有多少个数能整除2,n/4,代表有多少个数能整除两个2,n/8代表整除3个2。。。。以此类推。。。n/2+n/4+n/8....就是一共有多少个2能被整除

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Problem  cf/codeforces#369-E - ZS and The Birthday Paradox-  

题目大意

 告诉你假设一年有2^n 天,k个人里有至少两个人在同一天生日的概率

    假设该概率为p/q  (最简形式),请输出p ,q 分别对 1e6+3取模后的值

  数据范围:n , k <= 10^18。

解题分析

   首先如果k>2^n ,答案为1/1

否则答案可以很容易推出是 1-  (2^n-1)*(2^n-2)*....*(2^n-k+1)/(2^(nk))

假设算到了答案,那么我们得先约分啊,约分就得求gcd啊,显然下面分母是2的幂,gcd必然也是2^i,那么我们只要求出这个gcd,套个逆元暴力求分子分母就ok了。

怎么算gcd呢?既然gcd是2^i,那就算i即可,也就是计算(2^n-1)* ... *(2^n-k+1)含多少个因子2,

而这个就用到【勒让德定理】了,logk求出 k!里含多少个2.

知道了这个,用费马小定理,暴力求分子即可。

注意的是,分子最多有k项,k<=1e18,但是实际不用算那么多。

当k-1>=mod时,也就是说     某一项 (2^n%mod-i)==0 ,显然 该部分分子 实际为 (2^n-i),而其要对mod取模,如果前面的条件满足,则取模后必为零,答案就是0,可以不用再算了。所以要计算的分子最多就是min(k,mod)项

复杂度 min(mod,k)+ logk.logn

参考程序


#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iostream>
using namespace std;const double pi=acos(-1.0);
double eps=0.000001;
typedef long long  ll;
const int N=2*100000+50;
const ll mod=1e6+3;
long long powe_m(long long  a,long long  b )
{long long ans=1;long long tmp=a;while(b!=0){if (b&1)ans=ans*tmp%mod;tmp=tmp*tmp%mod;b=b>>1;}return ans;
}
ll cal_gcd(ll k)
{/*   for(int i=0; i<k; i++) //  (2^n-i)if (i%2==0)      num+=count_two_num(i);*/ll num=0;for (ll kk=k-1;kk;kk/=2) num+=kk/2;return num;
}
int  main()
{ll n,k;cin>>n>>k;if (n<=63){ll tmp=1LL<<n;if (k>tmp){printf("1 1\n");return 0;}}// ans = 1- A(2^n,k) / 2^(nk)ll num= cal_gcd(k);ll fenzi=1;ll two_n=powe_m(2,n);   //2^nfor(int i=1; i<k; i++){fenzi=fenzi*(two_n-i)%mod;  //A(2^n,k)if (two_n==i) break; // if  2^n%mod==i, fenzi=0;}ll two_gcd=powe_m(2,num);       //2^gcdfenzi=fenzi*powe_m(two_gcd,mod-2)%mod;ll fenmu=powe_m(two_n,k-1);fenmu=fenmu* powe_m(two_gcd,mod-2)%mod;fenzi=fenmu-fenzi;if (fenzi<0) fenzi=(fenzi%mod+mod)%mod;if (fenmu<0) fenmu=(fenmu%mod+mod)%mod;printf("%lld %lld\n",fenzi,fenmu);return 0;}






cf/codeforces#369-E - ZS and The Birthday Paradox- 数学+gcd+逆元+勒让德定理相关推荐

  1. Codeforces Round #766 (Div. 2) D. Not Adding 数学gcd

    传送门 文章目录 目录 题意: 思路: 目录 题意: 给你一个长度为nnn的数组,你每次可以选择其中的两个数,如果他们的gcdgcdgcd在数组中没有出现那么就可以加在数组后面构成一个新的数组,问数组 ...

  2. CF369E. ZS and The Birthday Paradox

    1 /* 2 cf369E. ZS and The Birthday Paradox 3 http://codeforces.com/contest/711/problem/E 4 抽屉原理+快速幂+ ...

  3. [CF]Codeforces Round #529 (Div. 3)

    [CF]Codeforces Round #529 (Div. 3) C. Powers Of Two Description A positive integer xx is called a po ...

  4. Codeforces Round #774 (Div. 2) Power Board(数学)

    Codeforces Round #774 (Div. 2) Power Board(数学) 链接 题意:给一个n*m的矩阵,每个元素的值是 i j i^j ij,问有多少个不一样的元素 思路:不过这 ...

  5. CodeForces #369 div2 D Directed Roads DFS

    题目链接:D Directed Roads 题意:给出n个点和n条边,n条边一定都是从1~n点出发的有向边.这个图被认为是有环的,现在问你有多少个边的set,满足对这个set里的所有边恰好反转一次(方 ...

  6. [CF]Codeforces Round #528 Div.2

    Div.2还是稳定四题啊,E题还是没得办法,就争取四题再快点吧. A(签到) 题意:写下s的第一个字符,在最右边写下s的第二个字符,在最左边写下s的第三个字符,以此类推生成字符串t,给出t,求s 找规 ...

  7. [CF]Codeforces Round #546 (Div. 2)

    solved 3 A(签到) 题意: 签到 #include<bits/stdc++.h> using namespace std; #define rep(i,n) for(int i= ...

  8. [cf]Codeforces Round #782 (Div. 2)

    目录 前言 A.Red Versus Blue code B. Bit Flipping code C Line Empire code D.(完全不会,蹲大佬的题解) 前言 传送门 : (那天人们又 ...

  9. 除法逆元(ZS and The Birthday Paradox,cf 711E)

    这题真挺不错的,需要一些数学知识,对细节要求高. 一些资料与参考: 除法逆元 http://blog.csdn.net/acmmaxx/article/details/18409701 逆元详解 ht ...

最新文章

  1. 巴菲特+查理芒格+投资理论+经典语录+给韭菜的启示
  2. mysql2已经存在数据数据导入,在MYSQL中导入已存在的数据库
  3. 【技术总结】几种常用的无线串行通信技术
  4. 求最小生成树-Kruskal(克鲁斯卡尔算法)
  5. 干货 | 双目摄像头实现手势识别,完美还原人体运动手势
  6. mysql瓶颈分析_网站瓶颈分析—MYSQL性能分析
  7. 白鹭引擎增加点击事件实例
  8. Java基础---循环结构+例题
  9. Java中的queue和deque对比详解
  10. smarty模板引擎
  11. 记录一次OOM排查经历
  12. 教我兄弟学Android逆向
  13. notepad++正则表达式使用
  14. mysql的索引和触发器_MYSQL数据库学习----索引和触发器
  15. 【VScode】优雅地将代码打印为 PDF
  16. IOS开发之——屏幕适配-AutoLayout代码实现(03)
  17. multisim如何添加8050(例),8550,9013,9014
  18. 刘同-《谁的青春不迷茫》
  19. 程序员怎样才能实现财富自由
  20. 利用python识别图片中的条码及条码图片矫正和增强!

热门文章

  1. 回溯法专题--回溯法总结
  2. XSS XSRF 介绍与防范
  3. 开源法律蓝调:您遵守吗?
  4. 337、用三角形triangle、方形square、圆形circle等“基本图形“来表示任意的 图形 如菱形 半圆
  5. 【Matlab水果识别】自助水果超市【含GUI源码 594期】
  6. php删除数据参数错误,php - 向数据表发送JSON给我参数错误 - SO中文参考 - www.soinside.com...
  7. 机器学习实战:逻辑回归(2)-从疝气病症预测病马的死亡率
  8. Android 之 一键抠图,抠人像
  9. 10-ADC和触摸屏
  10. 【S3C2440】第17课、LCD之学习笔记