Mais conteúdo relacionado happy b1rthday 2 me 解説8. 考察
• 試しに、1から2121までの数字で “12” の出てくる回数を調べます
• 次に、真ん中2桁が12となるような数字の個数を考えます
• 10 + 10 + 2 = 22個です
2121
12 → 120 ~ 129, 1120 ~ 1129, 2120 ~ 2121
13. 一般化
• 他の数字に関しても、i桁目とi+1桁目の数字が11以下, 12, 13以上で
場合分けしていけば、足し合わせていけます
• A a b B
• a * 10 + b < 12 …… A * 10^(Bの桁数)
• a * 10 + b == 12 …… A * 10^(Bの桁数) + B + 1
• a * 10 + b > 12 …… (A + 1) * 10^(Bの桁数)
18. 2121
2 2 → 2002 ~ 2112
2 2 → 202 ~ 292
22 → 22
2 → 2 計24コ
19. • 144 + 24 = 168
• これが、実際に (A, B) = (1, 2121) のときの答えです
• では、 A > 1 のときはどうしましょう
21. • 1からNまでつなげた文字列の “12” の個数を返す関数を count(N) と
して、 count(B) – count(A-1) とすればよい?
→ 実は一つ落とし穴があります
(多分サンプルは落とし穴に気づかなくても通ってしまうはず)
22. • 1からNまでつなげた文字列の “12” の個数を返す関数を count(N) と
して、 count(B) – count(A-1) とすればよい?
• (A, B) = (22, 23) のとき
• count(B) = count(23) = 3 (1,2, … ,12, … ,21,22,23)
• count(A-1) = count(21) = 2 (1,2, … ,12, … ,21)
• count(B) – count(A-1) = 1, ……だけど実際 “2223” に “12” は含まれない
23. • 1からNまでつなげた文字列の “12” の個数を返す関数を count(N) と
して、 count(B) – count(A-1) とすればよい?
• A-1 と A をつなげて “12” が作られる場合に、1つ多く出てしまう
• つまりAが上一桁、下一桁ともに “2” であるとき-1すればよい
• ここまで処理すればACとなります
26. 結果的コーナーケース
• (A, B) = (2, 3), (22, 23)
• まぁサンプルにないからね
• 俺も最初気づかなくて、(2, 3)を入れてんんん??? ってなりました
• (A, B) = (1212, 1212)
• これはなんでひっかかってんのかわからない……
• (A, B) = (2, 2), (2, 3)
• A = 22 とかのときは対策したけど A = 2 のときを忘れてたという感じかなぁ
• (2, 1234567890) みたいなケースを作ってなかったので、小さい数のときは
StringBuilderでつなげて数え上げる、みたいな解法してたら落とせてないで
すね……甘かった