链接
题解
a n s = 1 − 2 n ( 2 n − 1 ) ( 2 n − 2 ) … ( 2 n − ( k − 1 ) ) 2 n k ans = 1 - \frac{2^n(2^n-1)(2^n-2)\dots(2^n-(k-1))}{2^{nk}} ans=1−2nk2n(2n−1)(2n−2)…(2n−(k−1))
最头疼的地方就在于约分
然而幸好 2 n − x 2^n-x 2n−x中包含 2 2 2的幂次和 x x x中包含 2 2 2的幂次是相等的,所以就可以 O ( l o g k ) O(logk) O(logk)求出这个幂次了
为啥相等?简单口胡一下:
对于 x < 2 n x < 2^n x<2n,要使 2 k ∣ ( 2 n − x ) 2^k|(2^n-x) 2k∣(2n−x),已经有 2 k ∣ 2 n 2^k|2^n 2k∣2n,则必有 2 k ∣ x 2^k|x 2k∣x
如果 2 ( k + 1 ) ∤ ( 2 n − x ) 2^(k+1)\not|(2^n-x) 2(k+1)∣(2n−x),因为 2 k ∣ 2 n 2^k|2^n 2k∣2n,所以必定 2 k ∤ x 2^k\not|x 2k∣x
代码
import math
n, k = [int(x) for x in input().split()]
if n<70 and k>2**n:
print(1,1)
exit(0)
mod = int(1e6)+3
def fastpow(a,b):
t, ans = a, 1
while b:
if(b&1):
ans = ans*t%mod
t = t*t %mod
b>>=1
return ans
t=k-1
cnt=0
while t:
cnt += t>>1
t>>=1
x=0
t=fastpow(2,n)
if k<mod:
x=1
for i in range(1,k):
x = x*(t-i)%mod
y=fastpow(2,n*(k-1))
inv = fastpow(2,mod-2)
inv = fastpow(inv,cnt)
x=(x*inv%mod+mod)%mod
y=(y*inv%mod+mod)%mod
x=(y-x+mod)%mod
print(x,y)