Codeforces711E. ZS and The Birthday Paradox【数学题】

E. ZS and The Birthday Paradox

【题目描述】

传送门

【题解】

我们最后可以得到一个式子1A(2n,k)2nk1-\frac{A(2^n,k)}{2^{nk}}

然后对这个式子拆分1(2nk+1)(2nk+2)...(2n1)/2n(k1)1-(2^n-k+1)(2^n-k+2)...(2^n-1)/2^{n(k-1)}

因为分母只有2这个素因子,所以只要求出分子中2的个数就可以了。

我们知道gcd(2nk,2n)=gcd(k,2n)gcd(2^n-k,2^n)=gcd(k,2^n),所以我们只需要求(k1)!(k-1)!中2的质因子个数。

然后对于分子直接暴力求,肯定不会超过MOD次就会遇到x%MOD==0,所以复杂度可以保证。

【代码如下】

#include<cstdio>
using namespace std;
typedef long long LL;
const int MOD=1e6+3;
LL N,K,N2,TMP,Num,A,B;
LL qsm(LL x,LL b){LL Mul=1;for(;b;b>>=1,x=x*x%MOD) if(b&1) Mul=Mul*x%MOD;return Mul;}
bool check(){for(LL i=1,x=1;i<=N;i++) if((x*=2)>=K) return 0;return 1;}
int main(){
	scanf("%lld%lld",&N,&K);
	if(check()){printf("1 1\n");return 0;}
	for(LL i=K-1;i;i>>=1) Num+=i/2;TMP=1;N2=qsm(2,N);
	for(LL i=1;i<K&&TMP;i++) TMP=TMP*(N2-i)%MOD;
	LL INV=qsm(qsm(2,Num),MOD-2);
	A=TMP*INV%MOD,B=qsm(N2,K-1)*INV%MOD;A=(B-A+MOD)%MOD;
	printf("%lld %lld\n",A,B);
	return 0;
}
posted @ 2019-02-28 20:45  XSamsara  阅读(183)  评论(0编辑  收藏  举报