题面
先手绘
d
>
1
d>1
d>1 的情况,可以发现大十二变形的拆分是分层的。由几何知识可知,正十二变形共十二个内角,每个内角
150
°
150°
150°,只能被拆分为
90
°
+
60
°
90°+60°
90°+60°;当
d
>
1
d>1
d>1 时会涉及平角的拆分,其拆分方法有两种:将这条边上摆正方形且该边对应的内层的边长度不变或摆若干正三角形成梯形且该边对于的内层边长度减一。当内层空间变为正六边形时,只有一种填充方式即填满正三角形。
从上看出某层图形如果是十二变形则其边一定是某一边长与另一边长交替拼接而成的。所以设
f
i
,
j
f_{i,j}
fi,j 表示一种现一种边长为
i
i
i,另一种边长为
j
j
j,不考虑旋转对称的方案数。显然有
f
i
,
0
=
f
0
,
i
=
1
f_{i,0}=f_{0,i}=1
fi,0=f0,i=1,即内层图形为正六边形的情况。考虑边长为
i
i
i 的所有边对应的填法,若选择正方形则有方案数
f
i
,
j
−
1
f_{i,j-1}
fi,j−1,若选择三角形则有方案数
f
i
−
1
,
j
f_{i-1,j}
fi−1,j。因此,
f
i
,
j
=
f
i
−
1
,
j
+
f
i
,
j
−
1
f_{i,j}=f_{i-1,j}+f_{i,j-1}
fi,j=fi−1,j+fi,j−1,从而得到
f
i
,
j
=
(
i
+
j
i
)
f_{i,j}= \binom{i+j}{i}
fi,j=(ii+j)。由于要考虑旋转整个图形带来的影响,所以答案为
1
2
(
2
d
d
)
\frac{1}{2} \binom{2d}{d}
21(d2d)。
时间复杂度
O
(
d
+
log
2
P
)
O(d+ \log_2P)
O(d+log2P),空间复杂度
O
(
1
)
O(1)
O(1)
#include<iostream>
using namespace std;
#define R register int
#define L long long
#define P 998244353
inline int GetInv(int x){
int res=1,y=P-2;
while(y!=0){
if((y&1)==1){
res=(L)res*x%P;
}
x=(L)x*x%P;
y>>=1;
}
return res;
}
inline int GetC(int n){
int A=1,B=1;
for(R i=2;i<=n;i++){
A=(L)A*i%P;
}
for(R i=n<<1;i!=n;i--){
B=(L)B*i%P;
}
return(L)B*GetInv(A)%P;
}
int main(){
int d;
cin>>d;
cout<<499122177ll*GetC(d)%P;
return 0;
}