首页 > 其他分享 >Codeforces Round #818 (Div. 2) - D. Madoka and The Corruption Scheme

Codeforces Round #818 (Div. 2) - D. Madoka and The Corruption Scheme

时间:2022-09-21 15:01:34浏览次数:104  
标签:Madoka int ll Codeforces finv 主办方 Round mod

思维+组合数学

Problem - D - Codeforces

题意

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

img

问题是,求最小的编号,使得存在一个最优方案,使得无论主办方怎么改,都可以让他赢。主办方目标是让赢的人编号更大。

思路

  1. 转换为图论问题:设 Madoka 一开始规定的红边权值是 0,黑边权值是 1,记 \(f[x]\) 为从根节点到编号 x 的结点的路径边权和
  2. 若主办方想让编号为 x 的成为冠军,则 \(f[x]<=k\) (主办方必须把这 \(f[x]\) 条边全部逆转)
  3. 因为有 \(2^n\) 个叶子,就有 \(2^n\) 种互不相同的路径,权值为 i 的叶子相当于长度为 n 的路径上选 i 个黑边,有 \(\binom ni\) 个,所以主办方只能把 \(\sum\limits_{i=0}^{k}\binom ni\) 个叶子放到冠军,因此 Madoka 贪心地把编号最小的放到这些叶子的位置即可

代码

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>

using namespace std;
#define endl "\n"

typedef long long ll;
typedef pair<int, int> PII;

const int N = 1e5 + 10, mod = 1e9 + 7;
int n, k;
ll fac[N], finv[N];
ll qmi(ll a, ll b)
{
	ll ans = 1;
	while(b)
	{
		if (b & 1)
			ans = ans * a % mod;
		b >>= 1;
		a = a * a % mod;
	}
	return ans;
}

void presolve(int n)
{
	fac[0] = finv[0] = 1;
	for (int i = 1; i <= n; i++)
		fac[i] = fac[i-1] * i % mod;
	finv[n] = qmi(fac[n], mod - 2);
	for (int i = n - 1; i >= 1; i--)
		finv[i] = finv[i+1] * (i + 1) % mod;
}

ll C(int n, int m)
{
	if (m < 0 || n - m < 0)
		return 0;
	return fac[n] * finv[m] % mod * finv[n-m] % mod;
}
ll solve()
{
	if (k >= n)
		return qmi(2, n);
	ll ans = 0;
	for (int i = 0; i <= k; i++)
		ans = (ans + C(n, i)) % mod;
	return ans;
}
int main()
{
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	cin >> n >> k;
	presolve(n);
	cout << solve() << endl;
    return 0;
}

标签:Madoka,int,ll,Codeforces,finv,主办方,Round,mod
From: https://www.cnblogs.com/hzy717zsy/p/16715540.html

相关文章

  • Codeforces 821 Div2
    T1:大小为n的数组,最多进行k次操作:下标模k意义下相等则可进行交换。求操作后连续k个元素的最大值固定最大值的k个连续因素小标为[0,k),现在只需使得它为最大即可,将可交换位......
  • Codeforces Round #821 (Div. 2) - D2. Zero-One (Hard Version)
    区间DPProblem-D2-Codeforces题意给一个长度为\(n(5<=n<=5000)\)的01串,每次操作可选择一个\(l,r(l<r)\),把\(s[l],s[r]\)反转。如果\(l+1==r\),花费为x,否......
  • Codeforces Round #807 (Div. 2) - D. Mark and Lightbulbs
    思维Problem-D-Codeforces题意给两个长度为\(n(3<=n<=2*10^5)\)的01串s与t,求最小操作次数,使s变成t;不存在则输出-1操作为:对于2<=i<=n-1,若\(s_......
  • Codeforces Round #820 (Div. 3) G. Cut Substrings
    DPProblem-G-Codeforces题意给一个长度为\(n(1<=n<=500)\)的主串s,一个长度为\(m(1<=m<=500)\)的模式串t,每次可以将当前的s中与t相同的子串变成一串"."(如......
  • Codeforces Round #821 (Div. 2) ABCD1
    A.ConsecutiveSumhttps://codeforces.com/contest/1733/problem/A题目大意:给定一个长度为n的数组a。最多可以执行k次以下操作:选择两个指数i和j,其中imodk=jmodk......
  • Codeforces Round #821(Div.2) (A-C) 题解
    CodeforcesRound#821(Div.2)(A-C)  A.ConsecutiveSum大致题意给定一组共n个数据,如果俩个数的下标在modk意义下同余,则可以交换a[I]和a[j] ,求操作后一段......
  • Codeforces Round #821 (Div. 2)(持续更新)
    Preface唉LOL打到一半被迫营业开打,感觉这算是第一次自己认真的在线打CF,以我的老年人手速感觉要罚时飞起了10:35开始打到12:10顶不住了睡觉去了,E大概看了个题感觉挺有意思的......
  • Codeforces Round #819 (Div. 1 + Div. 2) and Grimoire of Code Annual Contest 2022
    Preface明天的CF一定打啊(绝对不咕),今天白天补现代作业,英语作业到哭,而且还要准备四六级,每天逼着自己背单词A.MainakandArray不难发现换中间的数不会影响答案,因此操作......
  • Codeforces Round #821 D2
    D2.Zero-One(HardVersion)我们由D1可知当我们的y小于x/2时我们可以用2y来减小相邻的cost那我们考虑要是y比较大的时候我们也可以用多个x来减小cost我们可以轻松的......
  • Codeforces Round #821 (Div. 2)
    CodeforcesRound#821(Div.2)C.ParityShuffleSorting题目大意每次操作可以选择l,r,如果\(a_l+a_r\)是奇数可以让\(a_l=a_r\),否则可以让\(a_l=a_r\),要求使用不超过n......