首页 > 其他分享 >题解:AT_arc190_b [ARC190B] L Partition

题解:AT_arc190_b [ARC190B] L Partition

时间:2025-01-15 23:33:30浏览次数:1  
标签:int 题解 sum Partition long vt arc190 calc MOD

题目传送门

很显然每次填完 L 之后所覆盖的图形为正方形,不然最最后无法填出正方形。现在假设我们已经确定了一个 \(k\) 阶的 L,要求它的方案数。

对于 \([1,k-1]\) 阶 L 的放法,每阶的 \(4\) 种方向都对应着一种方案,但 \(1\) 阶只有 \(4\) 种都是一样的,所以总方案数为 \(4^{k-2}\) 种。

对于 \([k+1,n]\) 阶 L 的放法,设其 \(k\) 阶 L 离上、下、左、右边界的距离分别为 \(a,b,c,d\),那么从中选出那些是覆盖上面的,那些是覆盖左边的,即可唯一确定一种放法,方案数 \(\binom{a+b}{a}\binom{c+d}{c}\)。

枚举 \((a,b)\) 是在 L 的四个角上或四个方向的边上,角的情况下 L 是确定的,直接算就行了。边上的情况中 L 是可以上下或左右平移的,其式子就是组合数的前缀和。记 \(f(n,k)=\sum\limits_{i=0}^k\binom{n}{k}\)。显然可以从 \(f(n,k)\) 转移到 \(f(n,k-1)\) 和 \(f(n,k+1)\)。又有

\[\binom{n}{k}=\binom{n-1}{k-1}+\binom{n-1}{k} \]

所以

\[f(n,k)=f(n-1,k-1)+f(n-1,k) \]

\[f(n-1,k)=\frac{f(n,k)+\binom{n-1}{k}}{2} \]

这样我们就能从 \(f(n,k)\) 转移到 \(f(n-1,k)\) 了。可以观察到总移动次数是 \(O(n)\) 的,直接转移即可。

一些注意的点:

  • 角的方案要 \(\times 3\),边的方案要 \(\times 2\)。
  • 转移的过程中可能会转移到 \(f(n,k)\) 中 \(k>n\) 的情况,这时候要从 \(f(n,n)=2^n\) 去转移。

Code:

const int N = 2e7 + 10, MOD = 998244353;
int n, a, b, q;
long long jc[N], jny[N], ny[N], pw2[N];
vector < pair <int, int> > vt, pt;
long long C(int x, int y){
	return jc[y] * jny[x] % MOD * jny[y - x] % MOD; 
}
long long gt(int x, int k){
	if(x < 0)
		return 0;
	auto t = (x < k / 2)? make_pair(0, 1ll) : make_pair(k, pw2[k]);
	for(auto i : vt)
		if(i.first <= k && abs(t.first - x) > abs(i.first - x))
			t = i;
	while(t.first < x)
		t.first++, t.second = (t.second + C(t.first, k)) % MOD;
	while(t.first > x)
		t.second = (t.second - C(t.first, k) + MOD) % MOD, t.first--;
	pt.push_back(t);
	return t.second;
}
long long calc(int a, int b, int c, int d){
	if(a <= 0 || b <= 0 || c > n || d > n)
		return 0;
	return C(a - 1, a - 1 + n - c) * C(b - 1, b - 1 + n - d) % MOD;
}
long long calc(int x, int y, int k){
	int l = max(1, y - k + 2), r = min(n - k + 1, y - 1);
	if(l > r)
		return 0;
	long long t = (gt(r - 1, n - k) - gt(l - 2, n - k) + MOD) % MOD, sum = 0;
	if(x + k - 1 <= n)
		sum = (sum + t * C(x - 1, n - k)) % MOD;
	if(x - k + 1 > 0)
		sum = (sum + t * C(n - x, n - k)) % MOD;
	return sum;
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin >> n >> a >> b >> q;
	jc[0] = jc[1] = ny[0] = ny[1] = jny[0] = jny[1] = pw2[0] = 1, pw2[1] = 2;
	for(int i = 2; i <= 2 * n; i++)
		ny[i] = (MOD - MOD / i) * ny[MOD % i] % MOD, jc[i] = jc[i - 1] * i % MOD, jny[i] = jny[i - 1] * ny[i] % MOD, pw2[i] = pw2[i - 1] * 2 % MOD;
	int la = n;
	while(q--){
		int k;
		cin >> k;
		while(la > n - k){
			la--;
			for(auto &i : vt)
				i.second = (i.second + C(i.first, la)) % MOD * ny[2] % MOD;
		}
		pt.clear();
		long long sum = (calc(a, b, k) + calc(b, a, k)) * 2 % MOD;
		if(k > 1)
			sum = (sum +(calc(a - k + 1, b - k + 1, a, b) + calc(a - k + 1, b, a, b + k - 1) + calc(a, b - k + 1, a + k - 1, b) + calc(a, b, a + k - 1, b + k - 1)) * 3) % MOD;
		else
			sum = (sum + calc(a, b, a, b)) % MOD;
		swap(pt, vt);
		sort(vt.begin(), vt.end());
		vt.erase(unique(vt.begin(), vt.end()), vt.end());
		cout << sum * pw2[max(0, k - 2) * 2] % MOD << "\n";
	}
}

标签:int,题解,sum,Partition,long,vt,arc190,calc,MOD
From: https://www.cnblogs.com/louisliang/p/18673893

相关文章

  • Codeforces 1536B Prinzessin der Verurteilung 题解 [ 紫 ] [ 后缀自动机 ] [ 动态规
    PrinzessinderVerurteilung:最短未出现字符串的板子。思路考虑在SAM上dp,定义\(dp_i\)表示从\(i\)节点走到NULL节点所花费的最少步数。显然我们建出反图,跑DAG上dp即可。转移如下:\[dp_i=1+\min_{j=1}^{|v_i|}dp_{v_{i,j}}\]输出方案的话记录下每个dp值的先驱,最......
  • [CF2057G] Secret Message 题解
    神秘题目。题目的条件十分神奇,\(|A|\le\frac{1}{5}(s+p)\),不知所云。一开始尝试用皮克定理转化,但是failed。阅读理解之后发现有一个(很典)的套路,就是构造出五组方案,使得\(\sum_{cyc}|A|=s+p\),这样就一定有一组方案,面积小于等于$\frac{1}{5}(s+p)$。如何构造?我们发现......
  • AcWing 274. 移动服务 题解
    Tag:线性dp题面link题目描述一个公司有三个移动服务员,最初分别在位置\(1,2,3\)处。如果某个位置(用一个整数表示)有一个请求,那么公司必须指派某名员工赶到那个地方去。某一时刻只有一个员工能移动,且不允许在同样的位置出现两个员工。从\(p\)到\(q\)移动一个员工,需要花费......
  • 第七届传智杯初赛第二场(abc三组)补题+题解python
    文章目录前言A计算商品打折结算金额(B组、C组)B茶杯和球(A组、C组)C游游的字母串(A组、B组、C组)D电梯(B组、C组)E小欧的排列计算(A组、B组、C组)F游游的字母子串(A组、B组、C组)G跳跳跳(A组、B组)H小红的战争棋盘(A组)前言在CSDN上并未找到第七届传智杯......
  • 信号与系统(郑君里)第一章-绪论 1-1 课后习题解答
    题目详情(1-1分别判断题图1-1所示各波形是连续时间信号还是离散时间信号,若是离散时间信号是否为数字信号?)答案解析:(a)连续信号模拟信号(b)连续信号量化信号(c)离散信号数字信号(d)离散信号抽样信号(非数字信号)(e)离散信号数字信号(f)离散信号数字信号tips:本道题目考察了连续/......
  • ABC 243题解
    ABC243A-C太水不写了。D题意:从完全二叉树上点\(X\)开始移动,每次移动至父节点、左子节点或右子节点。询问N次移动后所处节点,保证答案小于\(10^{18}\)。解法:忘了过程有可能超longlong浪费两分钟。总之就是每一个向父节点操作会消掉最近一个未消掉的向儿子移动操作,然后......
  • {LOJ #6041. 「雅礼集训 2017 Day7」事情的相似度 题解
    \(\text{LOJ\#6041.「雅礼集训2017Day7」事情的相似度题解}\)解法一由parent树的性质得到,前缀\(s_i,s_j\)的最长公共后缀实质上就是\(i,j\)在SAM中的\(\operatorname{LCA}\)在SAM中的\(\operatorname{len}\)。让我们考虑如何处理\((l,r)\)区间内的询问。直......
  • Codeforces Round 992 (Div. 2) C题解析
    CodeforcesRound992(Div.2) C题解析题目描述......
  • P4770 [NOI2018] 你的名字 题解
    \(\text{P4770[NOI2018]你的名字题解}\)注意到\(l=1,r=|S|\)有整整68分的高分,让我们先来考虑这样的特殊情况。这样的特殊情形实际上要我们求的是\(t\)有多少个本质不同的子串满足其不是\(s\)的子串。正着做看上去有些困难,于是维护\(s,t\)的本质不同公共子串个数,用......
  • 嵌入式杂谈(问题解决一:使用HAL库时keil中代码的分区)
     如图,代码分区代码区域作用Privateincludes引入所需头文件,提供函数声明、类型定义和宏等Privatetypedef创建自定义数据类型,增强代码可读性与维护性Privatedefine定义常量和宏,方便代码修改与简化Privatemacro实现简单代码替换,简化代码逻辑Privatevariables声明和初始化......