Project Euler 029
2 ≤ a ≤ 5 と 2 ≤ b ≤ 5について, ab を全て考えてみよう:
22=4, 23=8, 24=16, 25=32
32=9, 33=27, 34=81, 35=243
42=16, 43=64, 44=256, 45=1024
52=25, 53=125, 54=625, 55=3125
これらを小さい順に並べ, 同じ数を除いたとすると, 15個の項を得る:
4, 8, 9, 16, 25, 27, 32, 64, 81, 125, 243, 256, 625, 1024, 3125
2 ≤ a ≤ 100, 2 ≤ b ≤ 100 で同じことをしたときいくつの異なる項が存在するか?
->次の問題
考え方
まずは総当りでやってみます。内包表記でabを生成し、set型に入れることで重複を除去します。シンプルに一行で書けますね。
def main():
print(len(set(a ** b for a in range(2, 101) for b in range(2, 101))))
if __name__ == '__main__':
main()
つぎに(全体の組み合わせ)-(重複するもの)を考えてみましたが、現状うまく言っておりません…
24=42や216=48=84=162のようにある数xのy乗が上限となる100以下の場合に重複する組み合わせが出そうです。
例えば2と4では以下の項目が重複しています
2: 24, 26,... 298, 2100
4: 222,223,...2249, 2250,
41はないので、49個の要素が重複しています。
同様にa=3~10のときに49個の重複が発生するので、これらを全体から引きます。
2と8では299=833までで32個の重複×3(2~4)、2と16では2100=1625までで24個×2(2~3)…のように重複するものを引いていけば答えが出るかなと思っていました。
うまくいきませんでした。原因としては164=322のように大きな数で発生する重複を除去できていなかったからです。良い方法考え中…