概要
決して難しい問題ではないのですが、「分かる」から「解ききる」までが少ししんどいです。場合によっては、しんどい数列のシグマ計算を乗り切る必要があり、公式解説でもそのような方法がとられていました。
しかしこの問題は、競技プログラミングらしい手法(主観)によって短時間で確実な実装をすることができます。
解法
とりあえず大筋として、次のような解法に至るのは難しくないでしょう。3辺を
(1)
(2)
(3)
「三角不等式」「周長の上限
・
・よって、(1) の数え上げは、
のような格好です。
大体やることは分かるけれど、きちんと立式しようとすると大変
というのがこの問題です。
しかし、もろもろの場合分けが全て
・答を
・十分大きな
ことが分かります。したがって、
・十分小さな場合を全探索して答を出す
・適切な
・ここから
という方法で計算ができます。この方法であれば、条件が増えてきても、「全探索 → 条件を満たすものを抽出」というところの「条件」だけを管理すればよいので、実装ミス・計算ミスも起こりません。
多項式の次数に確信が持てなければ、少し高い次数の多項式と思って補間すればよいです。また、「12個おき」の部分に確信が持てない場合も、適当に数値実験をしたり、適当な倍数でとっておけばよいです。より強力な方法として、「剰余ごとには多項式」という数列は線形漸化式を持つので、Berlekamp–Masseyで殴るという方法もあると思います。
コメント
- 数学寄りの人ほど、きちんと手計算できる範囲は全部計算してしまおうと思いやすいかもしれません。このような考え方は競プロで初めて目にして、非常に感心させられました。うまく自分でも実用できてよかったです。