题意:
解法:
当 k > 2 n 时 , 显 然 概 率 = 1 , 下 面 只 考 虑 k < = 2 n 的 情 况 . 容 易 想 到 将 问 题 转 化 为 1 − ( k 个 人 生 日 互 不 相 同 的 概 率 ) . k 个 人 生 日 互 不 相 同 的 概 率 = A ( 2 n , k ) 2 n k = ∏ i = 2 n − k + 1 2 n i 2 n k = ∏ i = 2 n − k + 1 2 n − 1 i 2 n ( k − 1 ) 分 母 可 以 直 接 快 速 幂 . 对 于 分 子 部 分 , 由 于 需 要 对 1 e 6 + 3 取 模 , 那 么 当 分 子 存 在 1 e 6 + 3 时 , 取 模 就 会 变 成 0 , 观 察 到 分 子 的 区 间 为 [ 2 n − 1 − k + 1 , 2 n − 1 ] , 区 间 长 度 = k − 1 , 当 k − 1 > = 1 e 6 + 3 时 , 一 定 存 在 一 个 1 e 6 + 3 的 倍 数 , 当 k − 1 < 1 e 6 + 3 时 , 直 接 暴 力 计 算 分 子 即 可 . 还 有 一 个 问 题 是 分 数 A / B 需 要 先 约 分 再 取 模 , 由 于 分 母 只 包 含 2 , 因 此 g c d 一 定 是 2 的 幂 次 , 指 数 = 分 子 中 2 的 个 数 , 如 何 计 算 分 子 中 2 的 个 数 ? 由 于 分 子 是 连 乘 形 式 , 因 此 等 价 于 对 每 个 乘 积 项 算 出 2 的 个 数 , 然 后 将 所 有 个 数 相 加 就 是 分 子 中 2 的 个 数 了 . 这 里 有 一 个 重 要 结 论 : 如 果 对 于 x < 2 n , x 能 提 取 出 2 d , 那 么 2 n − x 也 能 提 取 出 2 d . 因 此 计 算 ∏ i = 2 n − k + 1 2 n − 1 i 能 提 取 出 来 多 少 个 2 , 等 价 于 计 算 ∏ i = 1 k − 1 i = ( k − 1 ) ! 能 提 取 出 多 少 个 2. k − 1 < = 1 e 6 + 3 , ( k − 1 ) ! 的 质 因 子 2 数 量 很 容 易 求 了 . 最 后 我 证 明 一 下 上 面 的 结 论 : x 能 提 取 出 2 d , 那 么 x = 2 d ∗ p , 其 中 p 与 2 互 质 , 即 p 是 奇 数 , 2 n − x = 2 d ∗ 2 n − d − 2 d ∗ p = 2 d ( 2 n − d − p ) , 显 然 2 n − d − p 也 与 2 互 质 , 即 也 是 奇 数 , 因 此 2 n − x = 2 d ( 2 n − d − p ) 提 取 出 的 也 是 2 d . 当k>2^n时,显然概率=1,下面只考虑k<=2^n的情况.\\ 容易想到将问题转化为1-(k个人生日互不相同的概率).\\ k个人生日互不相同的概率=\frac{A(2^n,k)}{2^{nk}}\\ =\frac{\prod_{i=2^n-k+1}^{2^n}i}{2^{nk}}=\frac{\prod_{i=2^n-k+1}^{2^n-1}i}{2^{n(k-1)}}\\ 分母可以直接快速幂.\\ 对于分子部分,由于需要对1e6+3取模,\\ 那么当分子存在1e6+3时,取模就会变成0,\\ 观察到分子的区间为[2^n-1-k+1,2^n-1],区间长度=k-1,\\ 当k-1>=1e6+3时,一定存在一个1e6+3的倍数,\\ 当k-1<1e6+3时,直接暴力计算分子即可.\\ 还有一个问题是分数A/B需要先约分再取模,\\ 由于分母只包含2,因此gcd一定是2的幂次,指数=分子中2的个数,\\ 如何计算分子中2的个数?\\ 由于分子是连乘形式,因此等价于对每个乘积项算出2的个数,\\ 然后将所有个数相加就是分子中2的个数了.\\ 这里有一个重要结论:\\ 如果对于x<2^n,x能提取出2^d,那么2^n-x也能提取出2^d.\\ 因此计算\prod_{i=2^n-k+1}^{2^n-1}i能提取出来多少个2,\\ 等价于计算\prod_{i=1}^{k-1}i=(k-1)!能提取出多少个2.\\ k-1<=1e6+3,(k-1)!的质因子2数量很容易求了.\\ 最后我证明一下上面的结论:\\ x能提取出2^d,那么x=2^d*p,其中p与2互质,即p是奇数,\\ 2^n-x=2^d*2^{n-d}-2^d*p=2^d(2^{n-d}-p),\\ 显然2^{n-d}-p也与2互质,即也是奇数,\\ 因此2^n-x=2^d(2^{n-d}-p)提取出的也是2^d. 当k>2n时,显然概率=1,下面只考虑k<=2n的情况.容易想到将问题转化为1−(k个人生日互不相同的概率).k个人生日互不相同的概率=2nkA(2n,k)=2nk∏i=2n−k+12ni=2n(k−1)∏i=2n−k+12n−1i分母可以直接快速幂.对于分子部分,由于需要对1e6+3取模,那么当分子存在1e6+3时,取模就会变成0,观察到分子的区间为[2n−1−k+1,2n−1],区间长度=k−1,当k−1>=1e6+3时,一定存在一个1e6+3的倍数,当k−1<1e6+3时,直接暴力计算分子即可.还有一个问题是分数A/B需要先约分再取模,由于分母只包含2,因此gcd一定是2的幂次,指数=分子中2的个数,如何计算分子中2的个数?由于分子是连乘形式,因此等价于对每个乘积项算出2的个数,然后将所有个数相加就是分子中2的个数了.这里有一个重要结论:如果对于x<2n,x能提取出2d,那么2n−x也能提取出2d.因此计算i=2n−k+1∏2n−1i能提取出来多少个2,等价于计算i=1∏k−1i=(k−1)!能提取出多少个2.k−1<=1e6+3,(k−1)!的质因子2数量很容易求了.最后我证明一下上面的结论:x能提取出2d,那么x=2d∗p,其中p与2互质,即p是奇数,2n−x=2d∗2n−d−2d∗p=2d(2n−d−p),显然2n−d−p也与2互质,即也是奇数,因此2n−x=2d(2n−d−p)提取出的也是2d.
code:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxm=2e6+5;
const int mod=1e6+3;
int n,k;
int cal(int n,int x){
int ans=0;
while(n){
ans+=n/x;n/=x;
}
return ans;
}
int ppow(int a,int b,int mod){
int ans=1%mod;a%=mod;
while(b){
if(b&1)ans=ans*a%mod;a=a*a%mod;b>>=1;
}
return ans;
}
void solve(){
cin>>n>>k;
if(n<=60&&k>(1LL<<n)){//k>2^n的情况
cout<<"1 1"<<endl;return ;
}else{//其他情况一定k<=2^n,(n>60则2^n>1e18>k)
//分子=mul[2^n-1-k+1,2^n-1]
int t=ppow(2,n,mod);//2^n
int up=1;
for(int i=1;i<=k-1;i++){
up=up*(t-1-i+1)%mod;
if(!up)break;
}
//分母=(2^n)^(k-1)
int down=ppow(ppow(2,n,mod),k-1,mod);
//约分
int cnt=cal(k-1,2);//(k-1)!中2的个数
int inv=ppow(ppow(2,cnt,mod),mod-2,mod);//2^cnt的逆元
up=(up*inv%mod+mod)%mod;
down=(down*inv%mod+mod)%mod;
//1-A/B
up=(down-up+mod)%mod;
//输出答案
cout<<up<<' '<<down<<endl;
}
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);
solve();
return 0;
}