首页 > 其他分享 >[Tricks-00007]AGC070C 什么才是真正的容斥

[Tricks-00007]AGC070C 什么才是真正的容斥

时间:2025-01-02 17:34:20浏览次数:1  
标签:BB int Tricks 容斥 00007 ans 考虑 mod

呜呜。这题太难受了,还不知道以怎样的方式写能把其中的巧妙思维方式解释清楚。

先把做法的表象讲讲吧:

考虑翻折容斥。我以为这个做不了,实际是可以的啊!把 \(+1,-1,0\) 分别记作 A,B,X。则要求相当于,固定 A,B,X 分别的个数(记为 \(a,b,x\)),但要求不能出现连续的 AA 或者 BB 且前缀和非负的方案数。

很多同学会沿如下方向去想:注意到 X 只有分割作用,因此直接将其分成了 \(x+1\) 段,每段都形如 ABABABABA...BABABABAB...,然后用一些多项式把它们套起来。笔者场上就这么想的,最后 \(n^3\) 遗憾离场。

这样为什么不优呢?主要是因为我们多加了以一个维度,就要多枚举一个量,复杂度自然就上来了。因此我们要把这个字符串当成一个整体考虑。

前缀和非负这个条件,从整体上,还是只能从翻折容斥的角度考虑,因为其它法子好像都不怎么行得通。在这题里,比普通的翻折容斥增加的要求只有:不能相邻 AA 和 BB。

看着像一个不能刻画的信息。不过实际上,我们还要想办法找找方法。总方案数我们记为 \(f(a,b,x)\)。则答案应为 \(f(a,b,x)\) 减如下一个量:

  • 考虑到,一共走了 \(a+b\) 个有效步,走到了 \(a-b\),现在要翻折为 \(-2-(a-b)=b-a-2\),因此要走 \(b-1\) 个 \(+1\) 和 \(a+1\) 个 \(-1\)。因为 AA 和 BB 有人为的对称性,因此转换之后要求基本不会有变化。
  • 唯一的变化在于,第一个翻折点那里。显然降为 \(-1\) 时需要一个 B,也就是下一个字母不能是 B,只能为 A 或 X。所以剩余方案数应该是:在第一处 \(<0\) 位置之后一个字符只能为 B 或 X。
  • 情况一:为 B。此时注意到把这相邻两个 B 改成一个 B 不会有任何变化,因为我们还是可以定位出这个进入 \(<0\) 的位置,从而恢复原序列。因此答案就是 \(f(b-1,a+1-1,x)\)。
  • 情况二:为 X。此时我们也把这个 X 去掉,通过新字符串也是可以还原出来的,对应的是 \(f(b-1,a+1,x-1)\)。
  • 然而,有可能原来这里出现了 BXB 状物,去掉了之后变成了 BB,并不会在后面的 \(f\) 函数中统计到。因此这里要特殊考虑,其实可以把 XB 一起去掉就好了。答案是 \(f(b-1,a+1-1,x-1)\)。

这样,就把答案转化成了 \(O(1)\) 个 \(f(a,b,x)\) 加加减减。现在考虑一个 \(f\) 怎么求?这个仍然没那么好做。

一种想法,还是按 X 分段。然后你不出意外地又寄了,复杂度仍然要平方。

所以你只能考虑另一个办法:容斥。考虑所有相邻不合法的位置,我们钦定其中一些。也就是把这个字符序列分出段来,每一段记录具体信息:是几个 A 或是几个 B 或是 X。容斥系数显然就是 \((-1)^{\sum (len-1)}\)。段内的大小顺序要先确定好(两个 \(1\) 只有一种排法,一个 \(1\) 一个 \(2\) 有两种,这个可以直接拆成不定方程解来刻画)。因此,设分别有 \(a',b',x\) 段,则方案数为 \(\dfrac{(a'+b'+x)!C(a-1,a'-1)C(b-1,b'-1)}{a'!b'!x!}\)。

结果你发现,还是平方优化不掉,流泪!

最后说出最终做法,很神奇:考虑 \(a=0\) 时的特殊(要特判的)情况:这也可以理解为经典不定方程解数,答案为 \(C(x+1,b)\)。你会发现,钦定完 A 的分段后,我们可以把它理解为和 X 类似的东西,加在一起。于是答案就是:\(C(a-1,a'-1)C(x+a',x)C(a'+x+1,b)\) 即为其方案数!

最后总复杂度线性。太厉害啦,膜拜膜拜。

#include<bits/stdc++.h>
#define mod 1000000007
using namespace std;
int powdv(int x,int y=mod-2){
	int ans=1;
	while(y){
		if(y&1)ans=1ll*ans*x%mod;
		y>>=1,x=1ll*x*x%mod;
	}
	return ans;
}
int di[20000005],id[20000005];
void init(int n){
	di[0]=1;
	for(int i=1;i<=n;++i)di[i]=1ll*i*di[i-1]%mod;
	id[n]=powdv(di[n]);
	for(int i=n-1;i>=0;--i)id[i]=1ll*id[i+1]*(i+1)%mod;
}
int C(int n,int m){
	if(n<0||m<0||n<m)return 0;
	return 1ll*di[n]*id[m]%mod*id[n-m]%mod;
}
int suan(int a,int b,int x){
	if(x<0)return 0;
	if(a==0&&b==0)return 1;
	if(a==0||b==0)return C(x+1,a+b);
	int ans=0;
	for(int i=0;i<=a-1;++i){
		ans=(ans+1ll*C(a-1,i)*(i%2?mod-1:1)%mod*C(x+a-i,x)%mod*C(a-i+x+1,b))%mod;
	}
	return ans;
}
int main(){
	int n,a,b;
	scanf("%d%d%d",&n,&a,&b);
	init(n);
	int x=n-a-b;
	int ans=suan(a,b,x);
	ans=(ans-suan(b-1,a,x))%mod;
	ans=(ans-suan(b-1,a+1,x-1))%mod;
	ans=(ans-suan(b-1,a,x-1))%mod;
	printf("%d\n",(ans+mod)%mod);
	return 0;
}

标签:BB,int,Tricks,容斥,00007,ans,考虑,mod
From: https://www.cnblogs.com/maihe/p/18642484

相关文章

  • DirectX 修复工具 V4.3 绿色增强版:完美解决 DirectX 和 C++ 问题(修复 0xc000007b 错误
    DirectX修复工具V4.3绿色增强版:完美解决DirectX和C++问题简介DirectX修复工具是一款专为检测和修复DirectX问题而设计的实用工具。它能够精准定位问题并进行高效修复,特别是针对0xc000007b错误,拥有极高的修复成功率。本工具支持所有版本DirectX修复,同时增强版还额......
  • 【组合数学】二项式相关与容斥
    二项式定理\[(a+b)^n=\displaystyle\sum^{n}_{i=0}{\binom{n}{i}a^ib^{n-i}}\]证明:数学方法。\[(a+b)^n=a\times(a+b)^{n-1}=a\timesb\times(a+b)^{n-2}=\dots\]假设我们选了\(k\)个\(a\),我们就需要选\(n-k\)个\(b\),根据乘法原理,可......
  • 一些在开发中会用到的小tricks
    Array.from({length:20},(_,i)=>i+1)这一表达式在JavaScript中的作用是:创建一个长度为20的数组,并将数组中的每个元素初始化为1到20的数字。解析这个表达式Array.from()方法:Array.from()可以用来从一个类数组对象或可迭代对象创建数组。它也可以接收一个可选......
  • P3175 [HAOI2015] 按位或(min-max 容斥)
    题意有一个初始为\(0\)的变量\(x\),每次操作会以\(p_i\)的概率选择位于\([0,2^n)\)中的某个整数\(i\),并将\(x\)或上\(i\)。问期望几次操作后\(x=2^n-1\)。\(n\le20,\sump_i=1\)引入:min-max容斥以两个式子入手:\[\max(S)=\sum_{T\subseteqS}(-1)^{|T|+1}\min(T......
  • 容斥原理+组合计数note
    看课笔记:https://www.bilibili.com/video/BV1G3411h7f5/?spm_id_from=333.337.search-card.all.click&vd_source=47c0221101e188411183012cce9b216c讲的真的很好,但是我是不会去看普林斯顿数学指南的()枚举原理+加法原理+乘法原理枚举基本定理:找到对应的一一映射加法原理:集合加法......
  • 容斥技巧(长期更新)
    普通容斥反射容斥用于格路计数问题,可以在转移与格路计数类似的DP中见到,然后直接用数学方法优化。首先容易得到\((x_0,y_0)\)关于\(y=x+b\)对称得到\((y_0-b,x_0+b)\)。以及\((0,0)\)走到\((n,m)\)的方案数为\(\binom{n+m}n\)。先来考虑一下Catalan数的格路计数的推导方式解......
  • [Tricks-00006]CF1558E 如何处理无向图中的任意环?tourist 题,太神啦。
    题意:自己看去。不过有个限制别忘了:每个点的度数都至少为\(\geq2\)。我写这些Trick题解还是要说清思考方法。不过这个题确实有点难以观察到了/ll还是从简单到难地去讲吧:第一件事。如果没有后面那个不能返回的条件的限制。那么其实可能有很多种想法,不过大体思路都是统一的:每......
  • [Tricks-00005][NOIp2024]树上查询 思维方式还是要数形结合!
    题目链接。有一个经典结论是,在\(l<r\)的时候,\(dep_{\operatorname{LCA}(l,l+1,\dots,r)}=\min\limits_{i=l}^{r-1}dep_{\operatorname{LCA}(i,i+1)}\),证明也十分容易。特判掉\(k=1\)的特殊情况后,问题则可以转化成:有一个序列\(d_i=dep_{\operatorname{LCA}(i,i+1)}\),求\(\m......
  • Tricks
    记录做题时的一些有趣Tricks\(\text{Prob.1}\)P3674小清新人渣的本愿奇奇妙妙角色关系图算法:莫队、\(\text{bitset}\)思路令\(S=10^5\)考虑使用\(\text{bitset}\)来\(O(1)\)维护当前区间出现的数令\(u,v\)两个\(\text{bitset}\)分别维护\(x,S-x\)是否在区间......
  • [笔记]Important Tricks And Lemmas
    图论对于图路径的构造,常常思考是否可以对叶子节点进行某种配对。按照dfs序对节点进行配对是考虑的方向之一。例题P7320「PMOI-4」可怜的团主,P4665[BalticOI2015]。树上路径的交是路径。路径满足边数等于点数\(-1\),通常可以做某些神秘容斥。例题:2024省选集训Day8B......