Ruteのプログラミング日記

競技プログラミング(AtCoder)の問題の解説や、過去問を解いた感想、また解けない過去問について共有したいと思ってます。

AtCoder Beginner Contest 162 (感想&反省)後日談

AtCoder Beginner Contest 162が先週日曜日の21:00-22:40に開催されました。

皆さん、お疲れ様でしたー。

結果から申し上げますと3完でした。(D以降が解ける気がしなくて萎えてましたorz)

パフォーマンス ・レーティング変化

 コンテスト成績証

ユーザ名 Rute
コンテスト名 AtCoder Beginner Contest 162
順位 5450th / 10666
パフォーマンス 614
レーティング 440 → 459 (+19)

 

というわけでほぼ中央値みたいな順位でしたね()

 

A問題

https://atcoder.jp/contests/abc162/tasks/abc162_a

様々な解法が考えられます。

Nを、文字列Sと考え、S[0],S[1],S[2]に"7"が現れれば"Yes"と出力、そうでなければ"No"と出力しましょう。

 

コード:  https://atcoder.jp/contests/abc162/submissions/11787793

 

B問題

https://atcoder.jp/contests/abc162/tasks/abc162_b

(1,N)の区間で変数iを用いて以下のループを回します:(ans = 0とします)

もしiが3または5で割り切れるなら ans には何も加算しない

そうでなければans にiを加算する。

これにより、時間計算量O(N)で処理が可能です。

コード: https://atcoder.jp/contests/abc162/submissions/11791945

 

C問題

https://atcoder.jp/contests/abc162/tasks/abc162_c

ん...全探索か これはO(K^3)であり、制約K≦200の範囲では最大でも

8×10^6回だからPythonで間に合うな。

 

試しにコードテストに投げてみるか

 

コードテスト大混雑!!

コードテストしてから1分経過しても終わる見込みがない!!(

unratedを覚悟したが、「この現象により、コンテストがUnratedになることは、今のところありません。」ということからあることを思いつく。

コードテストが混雑してるならその時間利用して本気で全列挙してみるか。

ということで、やってみた!!

 

f:id:Rute_programming:20200412235510p:plain

▲This is 全列挙!

これで1≦K≦200の制約上の全ての答えを出すことが出来ました。

あとはこのリストのK-1番目の要素を出力してしまいましょう!

計算量 驚愕の O(1) !! O(1)解法です!(あまり類が無いと思います)

 ちなみに、後々調べてみると O(K^3)の解法では

Python3ではTLEになるものの、PyPy3ではACになることが判明。

あのときPython3で同様のコードを提出していたらペナルティを与えられたということです()

ちなみに、Python3とPyPyの違いについて、分かりやすくまとめてあると思ったページを以下に掲載しておきます。

https://qiita.com/OKCH3COOH/items/f0c5c4681bc30dddf7f4

 

D問題

スルー。

 

E問題

最初、おそらく計算量的に間に合わないことから、Double Factorialのように、何か計算をして出力をすることを思いつきました。

 

すると、以下のような数列が出来ました。(それぞれのN,Kに対してgcdを計算しました)

(Nを固定して、Kを変化させたときのgcdの総和の数列)

N = 2: 3,5,9,17,33,65 階差: 2+4+8+16+32
N = 3: 6,12,30,84,246,732 階差: 6+18+54+162+486
N = 4: 10,24,76,276,1060,4164 階差:14,52,200,784,3104

N = 2, N = 3のとき、階差が等比数列であると思ったのですが、N = 4の場合なぜか当てはまらず。

N = 5のときもあてはまらず。

結果、残り5分まで考えたものの、解の一般項が思いつかずここで撤退しました。

 

以上、ABC162の感想・反省などでした。

次回のABCではレーティング500・Highestを目指します!