ふくほのひとりごと。

高専生が勉強したことの自分用メモ。

AtCoder / スフィンクスのなぞなぞ

ふくほです。
ABC006-C スフィンクスのなぞなぞ
を解きました。
問題↓
atcoder.jp

考えたこと

鶴亀算を3変数にしたやつですね。
1\leq N \leq 10^5, 1\leq M \leq 5\times 10^5と大きめ。
三重ループは勿論、二重ループ
(2つの値を決めておいて、最後の1つが
条件を満たしているのか吟味する方法)
でも間に合わなさそう。
何とかして多重ループは
避けたいお気持ちでした。

ここで私は思いつきました。
赤ちゃんの数をa, 老人の数をb, 大人の数をc
と置いた時、問題から
 4a + 3b + 2c = m
a + b + c = n
の2つの式を満たすことがわかります。
ここから1文字を消去し
2変数の関係式に持ち込みます。
今回はcを消去しました。
結果
2a + b = m-2n
が得られます。
ここでbを固定してみると
a=(m-2n-b)/2
このaは非負整数になります。

最後に、c=n-a-bから
cを求めます。
cも非負整数であることを
確認する必要があります。

提出コード

C++
atcoder.jp

Python
atcoder.jp

複雑なデータ構造を
使わないものだったので
Pythonでも書いてみました。
同じような実装なのに
Pythonのほうが遅い…!
っていう気づきがありました。

感想

こういう簡単めな数学で
複雑じゃないアルゴリズムだと
実装が軽くて好き。
昔の問題なので、今のAtCoderだと
茶diff真ん中くらいかな。
なんて考えます。