AtCoder AGC051-A Dodecagon 解説
問題
1 辺の長さが
解説
正 12 角形の内角は 150 度なので、頂点部分は正方形と正三角形を隣り合う形で使う必要があります。…①
よって、ある頂点に注目した時、その頂点部分の埋め方は以下の実線と点線の二通りです。
また、正 12 角形の辺の部分で正方形と正三角形が隣り合うと、30 度の隙間が生まれてしまい、これは正方形と正三角形で埋めることができません。よって、辺の部分では正方形・正三角形が連続します。…②
①②から、ある頂点部分の埋め方を決めれば、以下のように外側の埋め方が確定します。
そうすると内側に 12 角形が現れます。外側の 12 角形の辺の長さが
内側の 12 角形も①②に基づいて外側から埋められて、そうするとさらにその内側に 12 角形が現れて.. と再帰的に続きそうです。
再帰的に考えるとすれば、正 12 角形以外の 12 角形を考える必要も生まれてくるため、ここで一般に辺の長さが
上記の図も参考に、この 12 角形の内側の 12 角形の辺の長さは以下の通りです。
- 「外側の 12 角形の正方形が接していた辺」と平行な辺:平行な辺と同じ長さ
- 「外側の 12 角形の正三角形が接していた辺」と平行な辺:平行な辺の長さ - 1
外側の頂点部分の埋め方によって
よって内側の 12 角形の辺の長さは
内側の 12 角形の埋め方の通りはそれぞれ
気になるのは
これは以下の図で色を塗られた 12 角形の内側のように、正六角形が現れることを表します。この場合、この正六角形の埋め方が
正六角形の内角は 120 度であることから、頂点部分は正三角形を隣り合う形で埋める必要があります。これと②から、正六角形の辺に接する部分は全て正三角形で埋めるしかありません。
また、埋めたその内側には辺の長さが 1 小さい正六角形が現れます。
再帰的に考えて、正六角形の埋め方は図の点線のように内部を全て正三角形で埋める 1 通りしかないことがわかります。
以上から、以下の漸化式が得られます。
求める答えは
小さな
確かに
よって
最後に、回転させて一致するものは同一のものとみなして数える必要があります。12 角形の最も外側の部分の埋め方の 2 通りは回転させると一致するため、これは区別してはならず、2 で割る必要があります。
コード
#include <atcoder/all>
#include "iostream"
using namespace atcoder;
using namespace std;
// ※ 実際の問題では求める個数を 998244353 で割ったあまりの出力が求められている
using mint = modint998244353;
int main() {
int D;
cin >> D;
mint res = 1;
for (int i = 0; i < D; ++i) {
res *= 2 * D - i;
}
for (int i = 1; i <= D; ++i) {
res /= i;
}
res /= 2;
cout << res.val() << "\n";
return 0;
}
感想
考察パートにウェイトがあって結論はシンプルなの、痺れます。
Discussion