首页 > 其他分享 >[HNOI2002]奶牛的运算

[HNOI2002]奶牛的运算

时间:2022-08-22 16:24:57浏览次数:96  
标签:ch 运算 符号 插板 相邻 HNOI2002 区间 操作 奶牛

题目链接

Solution

陈年老题了,但真是一道组合数好题。

根据数学知识,加括号就相当于改变里面的符号,所以我们可以将其看为对符号的修改,问题就变为:一个长度为 \(n-1\) 的符号序列,每次可以选一个区间将其符号反转,问 \(k\) 次操作后,能得到多少不同的序列。

要注意第一个符号没有办法改变,这在最后会提到。

引理

\(k\) 次对任意区间的操作可以看作不超过 \(k\) 次对互不相交且不相邻的区间的操作。

只考虑 \(2\) 个区间的情况即可推广,分情况讨论:

  1. 当区间不交时且不相邻时,可以通过相同的操作次数来实现相同的效果。
  2. 当区间有相交部分,例如 \([1,5]\) 和 \([3,7]\),容易发现对于相交的区间 \([3,5]\) 被改了 \(2\) 次又被改回来了,就相当于只改变了 \([1,2]\) 和 \([6,7]\)。可以通过相同的操作次数来实现相同的效果,注意这里包含了一个区间是另一个区间子集的情况。
  3. 当区间相邻,如 \([1,3]\) 和 \([4,5]\),我们可以通过一次操作 \([1,5]\) 即可实现相同效果。

答案

这样就很清楚了,答案就是选择至多 \(k\) 个不交也不相邻区间的方案数,插板法即可。

注意第一个符号是不能改的,于是头不能插板,而尾插板有意义,所以有 \(n-1\) 个位置,插至多 \(2\times k\) 个偶数板,组合数即可,答案为:

\[\sum_{i=0}^{2k} \binom{n-1}{i} \]

注意增量 \(\Delta=2\)。

Code

答案会很大,用高精,这里为了不占版面就不加了。

#include<bits/stdc++.h>
using namespace std;
void read(int &x)
{
	char ch=getchar();
	int r=0,w=1;
	while(!isdigit(ch))w=ch=='-'?-1:1,ch=getchar();
	while(isdigit(ch))r=(r<<3)+(r<<1)+(ch^48),ch=getchar();
	x=r*w;
}
int C(int n,int m)
{
	if(m==0)return 1;
	if(n<m)return 0;
	int ans=1;
	for(int i=1;i<=m;i++)
		ans*=(n-i+1),ans/=i;
	return ans;
}
int main()
{
	int n,k;
	read(n);read(k);
	int ans=0;
	for(int i=0;i<=2*k;i+=2)
		ans+=C(n-1,i);
	cout<<ans;
	return 0;
}

标签:ch,运算,符号,插板,相邻,HNOI2002,区间,操作,奶牛
From: https://www.cnblogs.com/LAK666/p/16613099.html

相关文章

  • 有理数运算
    https://www.acwing.com/problem/content/description/1580/思路:这题思路并不难,但如果你傻乎乎的一种一种情况的输出,那会非常的繁琐,巧妙的利用一个函数来统一起来实现。......
  • JavaScript快速入门-04-运算符
    4运算符4.1算术运算符4.1.1概述  JavaScript提供的算术运算符如下所示:类型符号示例加法运算符+a+b减法运算符-a-b乘法运算符*a*b除......
  • 3888:奶牛选美大赛(dfs+曼哈顿距离)
    描述 听说最新的时尚趋势是母牛的皮上有两个斑点,农夫约翰购买了一整群有两个斑点的奶牛。不幸的是,时尚潮流往往瞬息万变,而当下最流行的时尚是只有一个位置的奶牛!FJ想......
  • JAVA基础--运算符--2022年8月20日
    第一节1、算数运算符有哪些+ - * / %2、/需要注意什么,为什么?两个整数相除,结果一定也是整数,因为最高类型是整数 第二节把数字321拆分成3  2......
  • mysql-运算符
    1.算数运算符2.比较运算符安全等于运算符<=>可以用来对NULL进行判断,左右两值均为NULL则结果为13.非符号运算符(关键字运算符)ISNULL判断值,字符串或表达式是否为......
  • 运算符
    隐式转换两种类型的变量在进行运算或比较时,一种类型会向类一种进行转化,然后再进行比较和运算加法作为算数运算符(除string类型外的原始数据类型进行加法运算时)非数......
  • C# 使用SIMD向量类型加速浮点数组求和运算(1):使用Vector4、Vector<T>
    作者:目录一、缘由二、使用向量类型2.1基本算法2.2使用大小固定的向量(如Vector4)2.2.1介绍2.2.2用Vector4编写浮点数组求和函数2.3使用大小与硬件相关的向量(如Vector......
  • 取模运算的应用
    取模运算的应用LeetCode里遇到了很多求数量的题目,由于数量过于庞大,最终会要求返回(int)(result%Long),其中Long代表一个比较大的数,比如10^9+1今天再次遇到了这种......
  • 教练!我不想遍历了!——用bool运算有效减少dataframe的时间复杂度
    方法参考:python-降低pythonfor循环的时间复杂度-堆栈内存溢出(stackoom.com)朋友们,朋友们,事情是这样的。这几天博主在处理数据的时候遇到了这样的标注数据: ......
  • 【Java基础】三元运算符 a>b ? 1 : 2 ;
    1.三元运算符a>b?true:false;可以简化为if-else语句if(a>b){ System.out.println("true");}else{ System.out.println("false");}2.运算符的优先级只有单目运......