Codeforces711 E. ZS and The Birthday Paradox(数论)

题意:

在这里插入图片描述

解法:

当 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)=2nki=2nk+12ni=2n(k1)i=2nk+12n1i.,1e6+3,1e6+3,0,[2n1k+1,2n1],=k1,k1>=1e6+3,1e6+3,k1<1e6+3,.A/B,2,gcd2,=2,2?,2,2.:x<2n,x2d,2nx2d.i=2nk+12n1i2,i=1k1i=(k1)!2.k1<=1e6+3,(k1)!2.:x2d,x=2dp,p2,p,2nx=2d2nd2dp=2d(2ndp),2ndp2,,2nx=2d(2ndp)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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值