ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Codeforces Round #818 (Div. 2) D

2022-09-03 22:02:11  阅读:175  来源: 互联网

标签:res ll Codeforces 818 左边 fac Div inv mod


 

 

D:

题意: 由2^n个人进行锦标赛,编号1~2^n,每一场输的人失去比赛资格,赢的人继续。你可以选择他们进行的顺序,以及决定哪一边赢得比赛。你的目标是尽量让编号小的人赢得最终比赛。主办方可以改变其中至多k场比赛的结果,即本来是左边赢改为右边赢,本来是右边赢的改为左边。如下图,最左边红线是你选择的胜方。而主办方改动左边的一个结果,使得最终赢的人变成3。 问题是,求一个最小的编号,使得主办方无论怎么改,都可以让他赢。主办方的目的是使编号尽可能大的人赢。

分析:

 

杨辉三角最后一排的和刚好是2^n,也就是最后一排刚好有2^n 个人,杨辉三角,从左往右数,每个位置i ,代表这个位置经过 i 次修改后可以获胜,且这个数的右上角的数是上一层经过 i 次修改可以获胜的数,所以这一层的这一个数在杨辉三角中也代表经过刚好 i 次修改,整个杨辉三角中可以获胜的数的总和。

首先让最左边的人赢,我们让编号小的人尽量在左边,这样如果主办方仅修改一次,左边一侧的1的右边一个会刚好获胜,修改两次,右边第二个刚好会获胜,所以修改k次后会获得胜利的数直接通过累加最后一排的k个数即可

 

 答案就是 s

//#define int ll
const int N = 2e5+10,mod = 1e9+7;
int n,k;

int fac[N],inv[N];

ll qmi(ll a,ll b) {
    ll res = 1;for(;b;b>>=1,a = a * a % mod) if(b&1) res = res * a % mod;return res;
}

ll mul(ll a,ll b) {
    return (a * b) % mod;
}

void init() {
    fac[0] = 1;
    fo(i,1,2e5) fac[i] = (1ll * fac[i-1] * i) % mod;//记得要开ll
    inv[200000] = qmi(fac[200000],mod - 2);
    of(i,2e5,1) inv[i-1] = mul(inv[i],i);
}

ll C(ll n,ll m) {
    if(n < m || m < 0) return 0;
    return mul(fac[n],mul(inv[m],inv[n-m]));
}

void solve()
{
    cin>>n>>k;
    ll res = 0;
//    fo(i,0,10) {
//        dbb(i,fac[i]);
//    }
//    db(C(1,1));
    fo(i,0,(min(k,n))) 
    {
        
        res += C(n,i);
        res %= mod;
    } 
    cout<<res<<endl;
}

 

 

标签:res,ll,Codeforces,818,左边,fac,Div,inv,mod
来源: https://www.cnblogs.com/er007/p/16653787.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有