专栏文章
题解:AT_arc037_d [ARC037D] Chaotic Polygons
AT_arc037_d题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @min9p5yi
- 此快照首次捕获于
- 2025/12/01 22:51 3 个月前
- 此快照最后确认于
- 2025/12/01 22:51 3 个月前
题目大意
已经说的很清楚了
思路分析
首先注意到谢宾斯基三角形有自相似性,猜测前一层的答案可以用于求出这一层的答案,考虑递推。
令 为 阶谢宾斯基三角形内的简单多边形数量。
根据定义可以得知,这个三角形由上、左、右三个 阶谢宾斯基三角形(后称其子三角形)组成,于是 至少包含了 。
根据定义可以得知,这个三角形由上、左、右三个 阶谢宾斯基三角形(后称其子三角形)组成,于是 至少包含了 。
这三个部分各自的贡献已经求完了,考虑求合并起来的贡献,也就是会跨越子三角形的多边形。
可以发现,这个多边形一定会经过三个子三角形的三个交点,那么不妨把它拆成三部分,也就是在一个三角形内,从一个顶点到另一个定点的合法路径数量。
可以发现,这个多边形一定会经过三个子三角形的三个交点,那么不妨把它拆成三部分,也就是在一个三角形内,从一个顶点到另一个定点的合法路径数量。
令 为这个东西,考虑从右下角到左下角的情况,可以发现有两种情况:经过 / 不经过上面的子三角形。

于是推出 。
但这样对吗?
考虑经过上子三角形的情况,会发现我们不能保证正下方那个点是否被使用。
考虑转换思路,我们希望更有力地控制它的路径,就需要定义更多的状态,于是,我们让 表示从一个顶点到另一个顶点,且经过第三个点的合法路径数, 表示从一个顶点到另一个顶点,且不经过第三个点的合法路径数。

于是推出 。
但这样对吗?
考虑经过上子三角形的情况,会发现我们不能保证正下方那个点是否被使用。
考虑转换思路,我们希望更有力地控制它的路径,就需要定义更多的状态,于是,我们让 表示从一个顶点到另一个顶点,且经过第三个点的合法路径数, 表示从一个顶点到另一个顶点,且不经过第三个点的合法路径数。
因为我不会容斥,所以考虑硬推,手玩一下可以看见这么多种情况:

细细数一数,就可以得到一个不用容斥的递推式了:

细细数一数,就可以得到一个不用容斥的递推式了:
代码展示
CPP// 为观感已删去 %mod
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5,mod=1e9+7;
int L;
int f[N],g[N],h[N];
signed main(){
cin>>L;
f[0]=1;
g[0]=1;
h[0]=1;
for(int i=1;i<=L;i++){
g[i]=(2*g[i-1]+h[i-1])*g[i-1]*h[i-1];
h[i]=((((h[i-1]*h[i-1]+h[i-1]*h[i-1]*h[i-1])+2*g[i-1]*h[i-1])+g[i-1]*g[i-1])+2*g[i-1]*h[i-1]*h[i-1]);
f[i]=(3*f[i-1]+(g[i-1]+h[i-1])*(g[i-1]+h[i-1])*(g[i-1]+h[i-1]));
}
cout<<f[L];
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...