题解:AT_arc190_b [ARC190B] L Partition

news/2025/1/15 23:23:43/文章来源:https://www.cnblogs.com/louisliang/p/18673893

题目传送门

很显然每次填完 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;elsesum = (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";}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/869840.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java开发】实现 License 认证(只校验有效期)

一、License介绍 License也就是版权许可证书,一般用于收费软件给付费用户提供的访问许可证明 1.1 应用场景应用部署在客户的内网环境 这种情况开发者无法控制客户的网络环境,也不能保证应用所在服务器可以访问外网 因此通常的做法是使用服务器许可文件,在应用启动的时候加载…

Proj CJI Paper Reading: AdaPPA: Adaptive Position Pre-Fill Jailbreak Attack Approach Targeting LLMs

AbstractBackground: 目前的jailbreak mutator方式更集中在语义level,更容易被防御措施检查到 本文: AdaPPA (Adaptive Position Pre-Filled Jailbreak Attack) Task: adaptive position pre-fill jailbreak attack approach Method: 利用模型的instruction following能力,先…

【Java安全】浅谈内存马

一、内存马概述1.1 内存马产生的背景1.2 Java内存马的基本原理1.3 Java内存马的类型1.4 Java内存马的使用场景二、内存马注入实战演示2.1 JSP注入Filter内存马2.2 Fastjson反序列化注入内存马2.3 注入Agent内存马三、内存马的检测与防御3.1 内存马定位排查思路3.2 工具查杀3.3 …

Diary - 2025.01.15

pkuwc 烂完了,😭😭😭其实是 pkuwc2024 的东西。 Day 0 坐飞机坐飞机,嘟嘟嘟。 大飞机!!!!!!!! 我觉得最厉害的是这个飞机有 3D 地图啊,太帅了!!!但是比较悲伤的是我直到要到了才知道,前面都在看 B 站缓存的视频😭。 感觉,太美丽了杭州!!! 坐飞机的时…

floor_plan_meshproject增加角度正则损失

数据结构 data.x #(128, 16) 16 = triangles(9) + confidence(7) """ 每个元素 [x1, y1, z1, x2, y2, z2, x3, y3, z3, c_v1, c_v2, c_v3, c_e1, c_e2, c_e3, c_f] """ data.y #(128)encoded_x #(128, 576) encoded_x_conv # (2, 96, 576) …

2025.1.15 html基础

学习了html的基础知识,包括:n越大,字体越小换行标签表示一个完整的段落水平线标签链接: 内容 例如: <! --a页面-->这是A页面。<! --b页面-->这是B页面。在浏览器中点击“这是A页面”,会跳转到b页面。

位图有关的格式信息

GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&bmp); 获取 HBITMAP 句柄包含的位图信息结构,不包含像素数据内容。 typedef struct tagBITMAP {   LONG bmType; // 位图类型,必须为 0   LONG bmWidth; // 位图宽度(以像素为单位) …

Centos7.9安装kerberos

Centos7.9安装kerberos@目录一、背景二、Kerberos安装部署2.1kerberos服务端必要软件安装2.2配置krb5.conf2.3配置kdc.conf2.4配置kadm5.acl2.5创建Kerberos数据库2.6启动Kerberos服务2.7创建Kerberos管理员principal2.8客户端安装kerberos2.9Kerberos功能验证本人其他相关文章…

并发编程 - 初识线程

线程是操作系统单独执行任务的最小单元,分前台和后台,有优先级,经历多个状态。C#可设置线程优先级和类型,控制线程状态的方法有Start、Sleep等,但Suspend和Abort已被弃用。多线程编程需通过同步机制控制线程执行。01、什么是线程? 要深刻理解什么是线程,就需要了解计算机…

Wgpu图文详解(05)纹理与绑定组

前言 什么是纹理? 纹理是图形渲染中用于增强几何图形视觉效果的一种资源。它是一个二维或三维的数据数组,通常包含颜色信息,但也可以包含其他类型的数据,如法线、高度、环境光遮蔽等。纹理的主要目的是为几何图形的表面提供详细的视觉效果,使其看起来更加真实和复杂。而我…

DeepSeek V3:AI 模型的游戏规则改变者

DeepSeek V3:AI 模型的游戏规则改变者 什么是DeepSeek V3? DeepSeekDeepSeek V3:AI 模型的游戏规则改变者什么是DeepSeek V3? DeepSeek V3是一款具有革命性的混合专家(MoE)模型,总参数达6710亿,每个标记激活370亿参数 。MoE方法允许多个专门模型(即“专家”)在门控网…