Codeforces711E. ZS and The Birthday Paradox【数学题】
E. ZS and The Birthday Paradox
【题目描述】
【题解】
我们最后可以得到一个式子
然后对这个式子拆分
因为分母只有2这个素因子,所以只要求出分子中2的个数就可以了。
我们知道,所以我们只需要求中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;
}