1 /* 2 cf369E. ZS and The Birthday Paradox 3 http://codeforces.com/contest/711/problem/E 4 抽屉原理+快速幂+逆元+勒让德定理+费马小定理+欧拉定理+数论 5 题解:https://amoshyc.github.io/ojsolution-build/cf/cf369/pe.html 6 7 坑点: 8 1、long long 类型的常量一定要加LL,否则1<<n只在int范围内 9 2、带模的题目,最后一定要判断是否答案为负,答案为负数要加mod 10 */ 11 #include <cstdio> 12 #include <algorithm> 13 using namespace std; 14 const int mod=1000003; 15 long long n,k; 16 long long Legendre(long long n,long long p)//勒让德定理:O(logn) 算出n!中有多少个p 17 { 18 long long ans=0; 19 while(n>0) 20 { 21 ans+=n/p; 22 n/=p; 23 } 24 return ans; 25 } 26 long long pow(long long base,long long n) 27 { 28 long long ans=1; 29 base=base%mod;//先取模防止爆long long 30 while(n>0) 31 { 32 if(n&1) 33 ans=(ans*base)%mod; 34 base=(base*base)%mod; 35 n>>=1; 36 } 37 return ans; 38 } 39 int main() 40 { 41 //freopen("cf711E.in","r",stdin); 42 scanf("%I64d%I64d",&n,&k); 43 if(n<=63 && k>(1LL<<n))//抽屉原理 44 { 45 printf("1 1\n"); 46 return 0; 47 } 48 long long gcd=Legendre(k-1,2); 49 long long p=1,q;//p/q; 50 q=((n%(mod-1))*((k-1)%(mod-1))-gcd%(mod-1))%(mod-1)+mod-1;//欧拉函数降幂 51 //q=(n%(mod-1))*((k-1)%(mod-1))+mod-1-gcd; this is a wrong way!!!!!! 52 q=pow(2,q)%mod;//q=2^( n(k-1)-gcd ) <=> 2^((n(k-1)-gcd)%phi(mod)+phi(mod) ); 53 if(k-1>=mod)//抽屉原理得出在分子中必定存在一个%mod=0,标程大坑,不能直接输出1 1,即此处不约分。 54 p=0; 55 else 56 { 57 long long val=pow(2,n); 58 for(long long i=1;i<=k-1;i++) 59 { 60 p=(p*((val-i))%mod)%mod; 61 } 62 if(gcd) 63 { 64 p=(p*pow(pow(2,gcd),mod-2))%mod; 65 //p=(p+mod)/pow(2,gcd); 66 } 67 } 68 p=q-p; 69 if(p<0)//判断是否为负 70 p+=mod; 71 printf("%I64d %I64d\n",p,q); 72 return 0; 73 }