見出し画像

Python Atcoder 最大値から計算量を落とす

本日も、競技プログラミングを学習していく上で、

「この考え方大事だな」と思ったことについて記事にしていきたいと思います。

皆さんの学習の助けになったら、幸いです。

本日のトピック

そもそも計算量って

計算量とは、「アルゴリズムの計算効率や問題の難しさを測るための尺度」のことです。Atcoder、特にPythonではC問題以降の問題では、すごく重要な考えです。
Pythonは1秒あたりの実行可能オーダーは、10**7までです。ABC問題では実行時間の制限が2secなので、基本的に10**8オーダー以上の計算量だと【TLE】(時間かかり過ぎ)でエラーになります。

では、どうやったら計算量が落とせるのか? を問題を通して学習していきましょう。

良問題 -193C- Unexpressed- から

例題は、Atcoder ABC 193の C問題 Unexpressedから使用させていただきます。問題文↓

画像1

今回大事なのは、Nのオーダーが10**10だと言うこと。

先程も明記しましたが、Pythonは1秒あたりの実行可能オーダーは、10**7までです。 なので今回は、2から10**10までをfor文で回すことができません。

ではどうすれば良いでしょうか?

a,bの最大値について考えましょう。

今回は、a,bの最大値について考えましょう。

a**b =< N =< 10**10 なので、
a**b =10**10 ここから、aとbの最大値について考えてみましょう

aの最大値

b = 2 の時、aは最大値をとります。

a **2 = 10**10
a = 10**5

よって、aの最大値は10**5です。

次にbの最大値について考えます。

bの最大値
a = 2 の時、bは最大値をとります。計算式が少し複雑ですが、

2**b = 10**10
b log(2) = 10 log(10)
b = 10{ log(10) / log(2) }
b = 10 * 3.333・・
b <= 34

なので、b の最大値は34です。

上記のことから、計算量は
10**5 * 34 < 10**10 にできます!

実際のコード

N = int(input())
Settable = set()
# 2<a<10**5, 2<b<34なので
for a in range(2, 10**5 + 1):
   for b in range(2, 34):
       if a**b <= N:

           Settable.add(a**b)
amount = N-len(Settable)
print(amount)

上記のコードなら、TLEになることなく、コードを通すことができます。

終わりに

Atcoderをやる上で、計算量はすごく大事な要素になります。自分もまだまだ勉強途中なので、間違っているところがあったら、コメントお願いします!!



この記事が気に入ったらサポートをしてみませんか?