[mine806]

题意:每一个人手中有一个数,范围是[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减去这个数字
 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 } 
View Code

猜你喜欢

转载自www.cnblogs.com/PYWBKTDA/p/11290547.html