くろたんく雑記帳

日常とか、わんちゃんとか、機械学習とか、競プロとか、

MENU

Python3で解く AtCoder Beginner Contest 148 C - Snack

目次

概要

問題
1. {\displaystyle a}{\displaystyle b}人でも均等にお菓子を分けられるような最小のお菓子の数は?

制約
  • {\displaystyle 1 \leqq a, b \leqq 10^5}
  • {\displaystyle a \neq b}
  • {\displaystyle a,\ b}は整数

解くときに考えた内容

  • 単純に{\displaystyle a, \ b}の最小公倍数を求める。
  • 最小公倍数を求めるには。最大公約数が必要。
  • 以下の手法を実装する

    最大公約数の求め方
    ユークリッドの互除法

    2 つの自然数 {\displaystyle a, \ b}{\displaystyle a\ \geqq \ b})において、 {\displaystyle a}{\displaystyle b}で割った余りを {\displaystyle r} とする。
    そのとき、 {\displaystyle a, b} の最大公約数は {\displaystyle b, \ r} との最大公約数に等しい。

ちなみにPythonには最大公約数がすでに実装されている。

  • Python3.4ならfractions.gcd、3.5以降はmath.gcdにあるがここでは、敢えて実装する。
  • 再帰的に実装する。(コードを見ればかなりシンプル)
  • 最小公倍数は以下の関係から実装する。

    最小公倍数の求め方
    正整数{\displaystyle a,\ b}において、{\displaystyle a}{\displaystyle b}bの最大公約数(gcd)と最小公倍数(lcm)の間には以下の関係がある。

    {\displaystyle gcd(a,\ b) \times lcm(a,\ b) = a \times b}

  • なので単純に{\displaystyle a, \ b}をかけて最大公約数で割ればいいが、オーバーフローに注意するために先に{\displaystyle a}を最大公約数で割ってしまう方がいい。


コード

import sys
sys.setrecursionlimit(10**7)

def gcd(a, b):
    if b == 0:
        return a
    else:
        return gcd(b, a%b)
def lcm(a, b):
    return int(a / gcd(a, b)) * b

a, b = map(int, input().split())
ans = lcm(a, b)
print(ans)

書籍

最近ポチった書籍
  • 実用的でないPythonプログラミング

バカ売れしているのか、アマゾンでは値段があがっている。自分は、予約していたのに来ないので、楽天で購入した。 内容としては、面白いテーマの物が多く、pygletなどを使って描画もあるような内容が結構推されているが、アルゴリズムに関する内容もある。特に前半は文字列を操作して暗号解読であったり、アナグラム・回文といったものが扱われているので勉強になる。遺伝的アルゴリズムも面白く金庫破りの実装は非常に参考になった。

blacktanktop.hatenablog.com

けんちょんさんこと、大槻さんの書籍である、「問題解決力を鍛える!アルゴリズムとデータ構造」 ご本人の記事の中で難易度は、螺旋本ということで初学者でも結構読みやすいのではないかと期待。(というのもけんちょんさんの記事はC++に疎い自分でも、その思考プロセスを学べるくらい丁寧に書かれているので)
投稿時点では、まだ発売前だけど、すでにベストセラー。予約しておかないとすぐ手元に来ないかも!?と思って速攻ポチった。

問題解決力を鍛える!アルゴリズムとデータ構造 (KS情報科学専門書)

問題解決力を鍛える!アルゴリズムとデータ構造 (KS情報科学専門書)

  • 作者:大槻 兼資
  • 発売日: 2020/10/02
  • メディア: 単行本(ソフトカバー)

drken1215.hatenablog.com

アルゴリズムの参考書籍

いわゆる、螺旋本。Aizu Online Judgeの問題を題材に解説されている。自分としては、 Aizu Online Judgeは最近はβ版運用中で、構成がアルゴリズムの項目ごとに問題がタグ付けされているようなイメージで、ここら辺弱いから集中的にやってみようっていう感じでできるので、いいと思っている。(AtCoderもそんな感じのリスト作って欲しい) ただ、この書籍はC++で書かれているのでPythonでやる場合はあくまでもその過程の考え方を参考にし自分で実装する必要がある。(AOJも解いているので、記事にしていこうかなぁ)