题意:每一个人手中有一个数,范围是[1,2^n],共有k个人,设存在两个人有相同数的概率的最简分数形式是a/b,分别求a和b模1e6+3,1<=n,k<=1e18
首先概率是$1-\sum_{i=0}^{k-1}(2^{n}-i)/2^{nk}$,显然两者的最大公约数一定是2的幂次,不妨设$1< k<2^{n}$(不在范围内直接输出),那么2的幂次就是$\sum_{i=1}^{60}(m-1)/2^{i}+n$,即分子分母都要除以这个值
考虑到费马小定理:$2^{P-1}\equiv 1(mod\ P)$,就可以快速计算分母(还有除数);另外当K>=P,在$(2^{n}-K+1,2^{n}]$中一定有一个P的倍数且无法被消掉,分子一定为0,还有要用1减去这个数字
View Code
考虑到费马小定理:$2^{P-1}\equiv 1(mod\ P)$,就可以快速计算分母(还有除数);另外当K>=P,在$(2^{n}-K+1,2^{n}]$中一定有一个P的倍数且无法被消掉,分子一定为0,还有要用1减去这个数字
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 #define mod 1000003 5 int s,a,b,mi[mod]; 6 ll n,k; 7 int main(){ 8 scanf("%lld%lld",&n,&k); 9 if ((n<=60)&&((1LL<<n)<=k)){ 10 printf("1 1"); 11 return 0; 12 } 13 for(int i=1;i<61;i++)s=(s+(k-1)/(1LL<<i))%(mod-1); 14 mi[0]=1; 15 for(int i=1;i<mod;i++)mi[i]=mi[i-1]*2%mod; 16 n%=mod-1; 17 s=(s+n)%(mod-1); 18 if (k>=mod)a=0; 19 else{ 20 a=1; 21 for(int i=0;i<k;i++)a=1LL*a*(mi[n]-i)%mod; 22 for(int i=1;i<=s;i++)a=a*(mod+1LL)/2%mod; 23 } 24 b=mi[(k%(mod-1)*n%(mod-1)-s+mod-1)%(mod-1)]; 25 a=(b-a+mod)%mod; 26 printf("%d %d",a,b); 27 }