<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5705819268459585346</id><updated>2024-09-22T21:14:49.994+09:00</updated><category term="python"/><category term="住所情報"/><category term="京都"/><title type='text'>漫ろ草 SozoroGusa</title><subtitle type='html'>「漫ろ」とは、「なんとなく」「そわそわして落ち着かない」「やたらに」というような意味です。&#xa;このようなノリで気になることをメモしていこうと思います。</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://sozorogusa.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://sozorogusa.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>こむ</name><uri>http://www.blogger.com/profile/10736571744712318490</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>175</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5705819268459585346.post-4363153599491619012</id><published>2017-03-20T09:19:00.000+09:00</published><updated>2017-03-20T09:19:10.957+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python"/><title type='text'>プロジェクトオイラー　問１２５</title><content type='html'>&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;プロジェクトオイラー(Project Euler)の問題をpythonでやってみます。&lt;br /&gt;日本語翻訳サイトは、プロジェクトオイラー日本語 でネット検索です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;問１２５「連続する平方数の和で表せる回文数の和」&lt;br /&gt;回文数 595 は連続する平方数の和で表すことができるという面白い性質を持つ:&lt;br /&gt;6&lt;sup&gt;2&lt;/sup&gt; + 7&lt;sup&gt;2&lt;/sup&gt; + 8&lt;sup&gt;2&lt;/sup&gt; + 9&lt;sup&gt;2&lt;/sup&gt; + 10&lt;sup&gt;2&lt;/sup&gt; + 11&lt;sup&gt;2&lt;/sup&gt; + 12&lt;sup&gt;2&lt;/sup&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;1000 未満で連続する平方数の和で表せる回文数はちょうど 11 あり, その合計は 4164 である.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;正の整数の平方のみをこの問題では扱うため, 1 = 0&lt;sup&gt;2&lt;/sup&gt; + 1&lt;sup&gt;2&lt;/sup&gt; は含めないことに注意せよ.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;回文数でありかつ連続する平方数の和で表せる, 10&lt;sup&gt;8&lt;/sup&gt; 未満のすべての数の合計を求めよ.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;注意！！！&lt;br /&gt;自力で解きたい人へ&lt;br /&gt;以降の記述には解法に関するネタバレが含まれます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;私の回答例は以下の通りです。&lt;br /&gt;
&lt;pre class=&quot;brush:python;collapse:true&quot; title=&quot;問１２５&quot;&gt;
def f(nmax):
&amp;#9;L = []
&amp;#9;M = [i*i for i in xrange(1, int(nmax ** 0.5)+1)]
&amp;#9;
&amp;#9;for i in xrange(len(M)):
&amp;#9;&amp;#9;s = M[i]
&amp;#9;&amp;#9;for j in M[i+1:]:
&amp;#9;&amp;#9;&amp;#9;s += j
&amp;#9;&amp;#9;&amp;#9;if s &gt;= nmax: break
&amp;#9;&amp;#9;&amp;#9;t = str(s)
&amp;#9;&amp;#9;&amp;#9;if t == t[::-1]: L.append(s)
&amp;#9;&amp;#9;&amp;#9;
&amp;#9;L = set(L)
&amp;#9;return sum(L), len(L)
&amp;#9;
if __name__==&quot;__main__&quot;:
&amp;#9;nmax = 10**8
&amp;#9;s, k = f(nmax)
&amp;#9;print &quot;値n ＜&quot;, nmax, &quot;の場合：合計 =&quot;, s, &quot;、個数 =&quot;, k
&lt;/pre&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;平方数の和で表せる数を計算し、それが回文数ならためるようにします。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;１．関数f(nmax)&lt;br /&gt;・値nの最大値を受け取り、平方数の和で表せる回文数の合計値と個数を返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;br /&gt;・M = [i*i for i in xrange(1, int(nmax ** 0.5)+1)]&lt;br /&gt;　Mは、必要な平方数の二乗値のリストです。&lt;br /&gt;　二乗値がnmax以下なので、二乗する値iはnmaxの平方根の整数部分までです。&lt;br /&gt;　forループ上の終端値はこの値を +1 した値となります。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;・for i in xrange(len(M)):&lt;br /&gt;　ループ変数iは、二乗値リストMの要素のうち、和の計算で使用する最初の値のインデックス値です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;・s = M[i]&lt;br /&gt;　sは二乗値の和です。初期値は二乗値リストMのi番目の値です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;・for j in M[i+1:]:&lt;br /&gt;　　s += j&lt;br /&gt;　ループ変数jは、二乗値リストMのインデックスi番目より後の値です。&lt;br /&gt;　sにjを累積していきます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;・if s &amp;gt;= nmax: break&lt;br /&gt;　二乗値の和sの最大値チェックです。nmax以上になったら処理終了です。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;・t = str(s)&lt;br /&gt;　if t == t[::-1]: L.append(s)&lt;br /&gt;　二乗値の和sの回文数チェックです。&lt;br /&gt;　二乗値の和sを文字型に変換してtとし、各桁を逆順に並べた文字列と一致するかを判定します。この回文数判定は&lt;a href=&quot;http://sozorogusa.blogspot.jp/2012/08/project-euler-probrem-36.html&quot;&gt;問３６&lt;/a&gt;のときと同じです。&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;　回文数の場合、リストLにためます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;・L = set(L)&lt;br /&gt;　リストLをset文で集合型にすることで、その要素の値をユニークにします。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;・return sum(L), len(L)&lt;br /&gt;　リストLの合計値と個数を返却します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;解答はこのすぐ下の行です。文字の色を白にしてます。選択状態にすると見えます。&lt;br /&gt;&lt;span style=&quot;color: white;&quot;&gt;値n ＜ 100000000 の場合：合計 = 2906969179 、個数 = 166&lt;/span&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://sozorogusa.blogspot.com/feeds/4363153599491619012/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sozorogusa.blogspot.com/2017/03/blog-post_20.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/4363153599491619012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/4363153599491619012'/><link rel='alternate' type='text/html' href='http://sozorogusa.blogspot.com/2017/03/blog-post_20.html' title='プロジェクトオイラー　問１２５'/><author><name>こむ</name><uri>http://www.blogger.com/profile/10736571744712318490</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5705819268459585346.post-501779229317717569</id><published>2017-03-18T21:08:00.000+09:00</published><updated>2017-03-18T21:08:30.105+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python"/><title type='text'>プロジェクトオイラー　問１２４</title><content type='html'>&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;プロジェクトオイラー(Project Euler)の問題をpythonでやってみます。&lt;br /&gt;日本語翻訳サイトは、プロジェクトオイラー日本語 でネット検索です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;問１２４「順序付き根基」&lt;br /&gt;n の&quot;根基&quot;(radical)は, rad(n) で表し, n の素因数の積を意味する. &lt;br /&gt;例えば 504 = 23 × 32 × 7 であるから, rad(504) = 2 × 3 × 7 = 42 である.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;1 ≦ n ≦ 10 に対して rad(n) を計算し, rad(n) を対象にソートし, rad(n) が同じ場合は n を対象にソートすると以下のようになる.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;未ソート 　 ソート済み &lt;br /&gt;&amp;nbsp;n rad(n) n rad(n) k &lt;br /&gt;&amp;nbsp;1&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1 &lt;br /&gt;&amp;nbsp;2&amp;nbsp; 2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2&amp;nbsp; 2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2 &lt;br /&gt;&amp;nbsp;3&amp;nbsp; 3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4&amp;nbsp; 2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3 &lt;br /&gt;&amp;nbsp;4&amp;nbsp; 2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8&amp;nbsp; 2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4 &lt;br /&gt;&amp;nbsp;5&amp;nbsp; 5&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3&amp;nbsp; 3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5 &lt;br /&gt;&amp;nbsp;6&amp;nbsp; 6&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 9&amp;nbsp; 3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6 &lt;br /&gt;&amp;nbsp;7&amp;nbsp; 7&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5&amp;nbsp; 5&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 7 &lt;br /&gt;&amp;nbsp;8&amp;nbsp; 2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6&amp;nbsp; 6&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8 &lt;br /&gt;&amp;nbsp;9&amp;nbsp; 3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 7&amp;nbsp; 7&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 9 &lt;br /&gt;10 10&amp;nbsp;&amp;nbsp;&amp;nbsp; 10 10&amp;nbsp;&amp;nbsp;&amp;nbsp; 10 &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;E(k) をソートした表の n の列の k 番目の要素とする. &lt;br /&gt;例えば, E(4) = 8, E(6) = 9 である.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;rad(n) を 1 ≦ n ≦ 100000 でソートした場合, E(10000) を求めよ.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;注意！！！&lt;br /&gt;自力で解きたい人へ&lt;br /&gt;以降の記述には解法に関するネタバレが含まれます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;私の回答例は以下の通りです。&lt;br /&gt;
&lt;pre class=&quot;brush:python;collapse:true&quot; title=&quot;問１２４&quot;&gt;
def f(nmin, nmax, k):
&amp;#9;P = p(nmax)
&amp;#9;E = []
&amp;#9;for n in xrange(nmin, nmax + 1):
&amp;#9;&amp;#9;if n &lt; 1: continue
&amp;#9;&amp;#9;L = [1]
&amp;#9;&amp;#9;m = n
&amp;#9;&amp;#9;for i in P:
&amp;#9;&amp;#9;&amp;#9;if m % i == 0:
&amp;#9;&amp;#9;&amp;#9;&amp;#9;L.append(i)
&amp;#9;&amp;#9;&amp;#9;&amp;#9;while m % i == 0: m //= i
&amp;#9;&amp;#9;&amp;#9;if m == 1: break
&amp;#9;&amp;#9;&amp;#9;
&amp;#9;&amp;#9;r = mul(L)
&amp;#9;&amp;#9;E.append((r, n, L[1:]))
&amp;#9;&amp;#9;
&amp;#9;Es = sorted(E)
&amp;#9;return Es[k-1]

def p(n):
&amp;#9;L = [0,0]+[1]*(n-1)
&amp;#9;i = 2
&amp;#9;while i*i&lt;=n:
&amp;#9;&amp;#9;while not L[i]: i += 1
&amp;#9;&amp;#9;for j in xrange(i+i, n+1, i): L[j] = 0
&amp;#9;&amp;#9;i += 1
&amp;#9;return [i for i in xrange(n+1) if L[i]]

def mul(L): return reduce(lambda x,y:x*y, L)

if __name__==&quot;__main__&quot;:
&amp;#9;nmin, nmax, k = 1, 100000, 10000
&amp;#9;r, n, L = f(nmin, nmax, k)
&amp;#9;print nmin, &quot;≦ n ≦&quot;, nmax, &quot;のとき、E(&quot;, k, &quot;) =&quot;, n
&amp;#9;print &quot;rad(&quot;, n, &quot;) =&quot;, &quot; x &quot;.join([str(i) for i in L]), &quot;=&quot;, r 
&lt;/pre&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;１．関数f(nmin, nmax, k)&lt;br /&gt;・nの最小値と最大値、問題で求めるk番目として指定するkを受け取り、&lt;br /&gt;　E(k)をソートした表の、k番目の(根基r, n, nの素数リスト)のタプルを返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;・P = p(nmax)&lt;br /&gt;　Pは必要な素数のリストです。nmax以下の素数が小さい順に入っています。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;br /&gt;・for n in xrange(nmin, nmax + 1):&lt;br /&gt;　ループ変数nは、nmimからnmaxまで１つずつ大きくしながら処理します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;・if n &amp;lt; 1: continue&lt;br /&gt;　nが1未満は処理対象外なので処理せず次のnへ進みます。&lt;br /&gt;&amp;nbsp;&lt;br /&gt;・L = [1]&lt;br /&gt;　Lはnを構成する素因数リストです。&lt;br /&gt;　根基の計算の掛け算のため、1を設定して初期化しておきます&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;・m = n&lt;br /&gt;　mはnを素因数で割った商です。素因数が判明する都度、値が変化します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;・for i in P:&lt;br /&gt;　ループ変数iは素因数リストPから小さい順に取り出した値です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;・if m % i == 0:&lt;br /&gt;　　L.append(i)&lt;br /&gt;　　while m % i == 0: m //= i&lt;br /&gt;　mが素数iで割り切れる場合、素因数リストLに追加し、mを素因数iで割れるだけ割り込んでおきます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;・if m == 1: break&lt;br /&gt;　mが1になれば素因数分解の終了で、素数iのループを終了します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;・r = mul(L)&lt;br /&gt;　rはnの根基です。関数mulで素数リストLの全要素の積を求めます。&lt;br /&gt;&amp;nbsp;&lt;br /&gt;・E.append((r, n, L[1:]))&lt;br /&gt;　Eは、(nの根基r, n, nの素因数リストL)のタプルをためるリストです。&lt;br /&gt;&amp;nbsp;&lt;br /&gt;・Es = sorted(E)&lt;br /&gt;　Esは上記Eに求める範囲のタプルをため終わったところで、ソートします。&lt;br /&gt;　ソートキーは、指定しない場合は先頭からになるので、&lt;br /&gt;　この場合、根基r、nの順にソートキーとして採用されます&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;・return Es[k-1]&lt;br /&gt;　求めるk番目の値は、ソート済リストEsのインデックスk-1番目の値です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;２．関数P(n)&lt;br /&gt;・n以下の素数を小さい順にもつリストを返します。&lt;a href=&quot;http://sozorogusa.blogspot.jp/2012/08/project-euler-probrem-37.html&quot;&gt;問３７&lt;/a&gt;で作成した関数を流用しました。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;３．関数mul(L)&lt;br /&gt;・リストLの全要素の積を返します。&lt;a href=&quot;http://sozorogusa.blogspot.jp/2015/05/blog-post_23.html&quot;&gt;問１１０&lt;/a&gt;で作成した関数を流用しました。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;解答はこのすぐ下の行です。文字の色を白にしてます。選択状態にすると見えます。&lt;br /&gt;&lt;span style=&quot;color: white;&quot;&gt;1 ≦ n ≦ 100000 のとき、E( 10000 ) = 21417&lt;br /&gt;rad( 21417 ) = 3 x 11 x 59 = 1947&lt;/span&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://sozorogusa.blogspot.com/feeds/501779229317717569/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sozorogusa.blogspot.com/2017/03/blog-post_18.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/501779229317717569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/501779229317717569'/><link rel='alternate' type='text/html' href='http://sozorogusa.blogspot.com/2017/03/blog-post_18.html' title='プロジェクトオイラー　問１２４'/><author><name>こむ</name><uri>http://www.blogger.com/profile/10736571744712318490</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5705819268459585346.post-6207773252046725833</id><published>2017-03-16T20:57:00.000+09:00</published><updated>2017-03-16T20:57:58.663+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python"/><title type='text'>プロジェクトオイラー　問１２３</title><content type='html'>&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;プロジェクトオイラー(Project Euler)の問題をpythonでやってみます。&lt;br /&gt;日本語翻訳サイトは、プロジェクトオイラー日本語 でネット検索です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;問１２３「素数の自乗で割った余り」&lt;br /&gt;p&lt;sub&gt;n&lt;/sub&gt; を n 番目の素数とする. (p1 = 2, p2 = 3, ...)&lt;br /&gt;r を (p&lt;sub&gt;n&lt;/sub&gt; - 1)&lt;sup&gt;n&lt;/sup&gt;
 + (p&lt;sub&gt;n&lt;/sub&gt; + 1)&lt;sup&gt;n&lt;/sup&gt; を p&lt;sub&gt;n&lt;/sub&gt;&lt;sup&gt;2&lt;/sup&gt; で割った余りとする.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;例えば, n = 3 のとき, p&lt;sub&gt;3&lt;/sub&gt; = 5 であり, 43 + 63 = 280 ≡ 5 mod 25.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;余り r が 10&lt;sup&gt;9&lt;/sup&gt; より大きくなる n の最小値は 7037 である.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;余り r が 10&lt;sup&gt;10&lt;/sup&gt; より大きくなる最初の n を求めよ.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;注意！！！&lt;br /&gt;自力で解きたい人へ&lt;br /&gt;以降の記述には解法に関するネタバレが含まれます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;私の回答例は以下の通りです。&lt;br /&gt;
&lt;pre class=&quot;brush:python;collapse:true&quot; title=&quot;問１２３&quot;&gt;
def f(rmin):
&amp;#9;for i, p in enumerate(P()):
&amp;#9;&amp;#9;n = i + 1
&amp;#9;&amp;#9;if n % 2:
&amp;#9;&amp;#9;&amp;#9;r = (2*n*p) % (p*p)
&amp;#9;&amp;#9;&amp;#9;if r &gt; rmin: return n, p, r
&amp;#9;&amp;#9;
def P():
&amp;#9;L, i = [2], 1
&amp;#9;yield 2
&amp;#9;while True:
&amp;#9;&amp;#9;i += 2
&amp;#9;&amp;#9;for j in L:
&amp;#9;&amp;#9;&amp;#9;if not i%j: break
&amp;#9;&amp;#9;else:
&amp;#9;&amp;#9;&amp;#9;L.append(i)
&amp;#9;&amp;#9;&amp;#9;yield i
&amp;#9;&amp;#9;&amp;#9;
if __name__==&quot;__main__&quot;:
&amp;#9;rmin = 10**10
&amp;#9;n, p, r = f(rmin)
&amp;#9;print &quot;n =&quot;, n, &quot;(素数p =&quot;, p, &quot;, 余りr =&quot;, r, &quot;)&quot;
&lt;/pre&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;１．関数f(rmin)&lt;br /&gt;・最小の余りrminを受け取り、問題に合うn番目の素数pとそのときの余りrについて、n,p,rを返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;・この問題は&lt;a href=&quot;http://sozorogusa.blogspot.jp/2017/03/blog-post.html&quot;&gt;問１２０&lt;/a&gt;の続きの問題です。&lt;br /&gt;　&lt;a href=&quot;http://sozorogusa.blogspot.jp/2017/03/blog-post.html&quot;&gt;問１２０&lt;/a&gt;では、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;(a - 1)&lt;sup&gt;n&lt;/sup&gt; + (a + 1)&lt;sup&gt;n&lt;/sup&gt; を n&lt;sup&gt;2&lt;/sup&gt; で割った余りをrとしていましたが、&lt;br /&gt;　本問では、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;(p&lt;sub&gt;n&lt;/sub&gt; - 1)&lt;sup&gt;n&lt;/sup&gt; + (P&lt;sub&gt;n&lt;/sub&gt; + 1)&lt;sup&gt;n&lt;/sup&gt; を p&lt;sub&gt;n&lt;/sub&gt;&lt;sup&gt;2&lt;/sup&gt;で割った余りをrとしています。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;・&lt;a href=&quot;http://sozorogusa.blogspot.jp/2017/03/blog-post.html&quot;&gt;問１２０&lt;/a&gt;の式に、a=p&lt;sub&gt;n&lt;/sub&gt;を代入すると以下のことがわかります。&lt;br /&gt;　余りrは、nが偶数か奇数かでパターンが異なります。&lt;br /&gt;　nが偶数の場合、余りrはaに関わらず 2 です。&lt;br /&gt;　nが奇数の場合、余りrは 2np&lt;sub&gt;n&lt;/sub&gt; をp&lt;sub&gt;n&lt;/sub&gt;&lt;sup&gt;2&lt;/sup&gt;で割った余りです。&lt;br /&gt;　&lt;br /&gt;・pは素数なので、2以外はすべて奇数です。&lt;br /&gt;　題意から答えは明らかに2よりも大きく、必ず奇数です。&lt;br /&gt;　このため、nが偶数のときは処理せず飛ばします。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;２．関数P()&lt;br /&gt;・素数を小さい方から昇順に返すジェネレーターです。呼び出しの都度、次の素数を返却します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;・&lt;a href=&quot;http://sozorogusa.blogspot.jp/2015/04/blog-post.html&quot;&gt;問１０８&lt;/a&gt;で作成した関数を改良しました&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;br /&gt;解答はこのすぐ下の行です。文字の色を白にしてます。選択状態にすると見えます。&lt;br /&gt;&lt;span style=&quot;color: white;&quot;&gt;n = 21035 (素数p = 237737 , 余りr = 10001595590 )&lt;/span&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://sozorogusa.blogspot.com/feeds/6207773252046725833/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sozorogusa.blogspot.com/2017/03/blog-post_16.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/6207773252046725833'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/6207773252046725833'/><link rel='alternate' type='text/html' href='http://sozorogusa.blogspot.com/2017/03/blog-post_16.html' title='プロジェクトオイラー　問１２３'/><author><name>こむ</name><uri>http://www.blogger.com/profile/10736571744712318490</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5705819268459585346.post-3614116258368841719</id><published>2017-03-12T09:08:00.000+09:00</published><updated>2017-03-12T09:08:23.189+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python"/><title type='text'>プロジェクトオイラー　問１２２</title><content type='html'>&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;プロジェクトオイラー(Project Euler)の問題をpythonでやってみます。&lt;br /&gt;日本語翻訳サイトは、プロジェクトオイラー日本語 でネット検索です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;問１２２「効率的なべき乗計算」&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;n15を求めるのに最も単純な方法では 14 回の掛け算が必要である.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;n × n × ... × n = n&lt;sup&gt;15&lt;/sup&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;しかし2進法を用いれば, 6 回の掛け算で計算できる.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;n × n = n&lt;sup&gt;2&lt;/sup&gt;&lt;br /&gt;n&lt;sup&gt;2&lt;/sup&gt; × n&lt;sup&gt;2&lt;/sup&gt; = n&lt;sup&gt;4&lt;/sup&gt;&lt;br /&gt;n&lt;sup&gt;4&lt;/sup&gt; × n&lt;sup&gt;4&lt;/sup&gt; = n&lt;sup&gt;8&lt;/sup&gt;&lt;br /&gt;n&lt;sup&gt;8&lt;/sup&gt; × n&lt;sup&gt;4&lt;/sup&gt; = n&lt;sup&gt;12&lt;/sup&gt;&lt;br /&gt;n&lt;sup&gt;12&lt;/sup&gt; × n&lt;sup&gt;2&lt;/sup&gt; = n&lt;sup&gt;14&lt;/sup&gt;&lt;br /&gt;n&lt;sup&gt;14&lt;/sup&gt; × n = n&lt;sup&gt;15&lt;/sup&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;ところがたった 5 回の掛け算のみでも計算できる.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;n × n = n&lt;sup&gt;2&lt;/sup&gt;&lt;br /&gt;n&lt;sup&gt;2&lt;/sup&gt; × n = n&lt;sup&gt;3&lt;/sup&gt;&lt;br /&gt;n&lt;sup&gt;3&lt;/sup&gt; × n&lt;sup&gt;3&lt;/sup&gt; = n&lt;sup&gt;6&lt;/sup&gt;&lt;br /&gt;n&lt;sup&gt;6&lt;/sup&gt; × n&lt;sup&gt;6&lt;/sup&gt; = n&lt;sup&gt;12&lt;/sup&gt;&lt;br /&gt;n&lt;sup&gt;12&lt;/sup&gt; × n&lt;sup&gt;3&lt;/sup&gt; = n&lt;sup&gt;15&lt;/sup&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;m(k)を n&lt;sup&gt;k&lt;/sup&gt; を求めるのに必要最低限な掛け算の回数と定義する.&lt;br /&gt;たとえば m(15)=5 である.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;1 ≦ k ≦ 200 に対し, Σ m(k) を求めよ.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;注意！！！&lt;br /&gt;自力で解きたい人へ&lt;br /&gt;以降の記述には解法に関するネタバレが含まれます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;私の回答例は以下の通りです。&lt;br /&gt;
&lt;pre class=&quot;brush:python;collapse:true&quot; title=&quot;問１２２&quot;&gt;
def f(n1, n2):
&amp;#9;L = [[] for i in xrange(n2 + 1)]
&amp;#9;M = [0 for i in xrange(n2 + 1)]
&amp;#9;L[1].append([])
&amp;#9;
&amp;#9;for i in xrange(1, n2):
&amp;#9;&amp;#9;for m in L[i]:
&amp;#9;&amp;#9;&amp;#9;s = m + [i]
&amp;#9;&amp;#9;&amp;#9;t = len(s)
&amp;#9;&amp;#9;&amp;#9;for j in s[::-1]:
&amp;#9;&amp;#9;&amp;#9;&amp;#9;for k in s[::-1]:
&amp;#9;&amp;#9;&amp;#9;&amp;#9;&amp;#9;u = j + k
&amp;#9;&amp;#9;&amp;#9;&amp;#9;&amp;#9;if not (i &lt; u  &lt;= n2): break
&amp;#9;&amp;#9;&amp;#9;&amp;#9;&amp;#9;if 0 &lt; M[u] &lt; t: continue
&amp;#9;&amp;#9;&amp;#9;&amp;#9;&amp;#9;if s in L[u]: continue
&amp;#9;&amp;#9;&amp;#9;&amp;#9;&amp;#9;L[u].append(s)
&amp;#9;&amp;#9;&amp;#9;&amp;#9;&amp;#9;M[u] = t
&amp;#9;return sum(M[n1:])
&amp;#9;
if __name__==&quot;__main__&quot;:
&amp;#9;print f(1, 200)
&lt;/pre&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;掛け算するときの掛ける数の指数を足していき、指定数に達するまでの最小回数を求めます。&lt;br /&gt;１度掛け算して作成した累乗値の指数は再利用できます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;掛け算で使用した指数値のユニークな配列を作成し、&lt;br /&gt;この要素と掛け算で到達したその指数値自身から、&lt;br /&gt;値を２つ取り出し、その和の累乗値の配列として順に計算していきます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;このとき、指数値のユニークな値の配列は複数パターンできることがあり、いずれも必要です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;例えば、n=5の場合、到達するパターンは[1,2,3]と[1,2,4]の２つあり、&lt;br /&gt;これを元にさらに大きな指数値について計算していくとき、&lt;br /&gt;どちらの系統を使った方が最小回数になるか、この段階では判断つかないためです。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;また、掛け算を実施した回数を別のリストに保存しておき、最後にその合計を求めます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;１．関数f(n1, n2)&lt;br /&gt;・題意にあるm(k)について、n1≦k≦n2のときのm(k)の和を返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;・L = [[] for i in xrange(n2 + 1)]&lt;br /&gt;　M = [0 for i in xrange(n2 + 1)]&lt;br /&gt;　Lは、そのインデックス位置の値の累積値を求めるときの「掛け合わせた指数値のユニークリスト」のリストです。&lt;br /&gt;　Mは、そのインデックス位置の値の累積値を求めるときの最小掛け算回数のリストです。&lt;br /&gt;　例えば、n=5の場合、L[5]=[[1, 2, 3], [1, 2, 4]]、M[5]=3　です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;・L[1].append([])&lt;br /&gt;　初期値です。これでn**1の場合に、この指数値までに使用した指数値のリストは無いが、この指数値そのもの（つまり、1）を使用して累乗していくことが可能になります。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;・for i in xrange(1, n2):&lt;br /&gt;　ループ変数iは、1からn2に至るインデックスです。累乗値計算の範囲です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;・for m in L[i]:&lt;br /&gt;　ループ変数mは「掛け合わせた指数値のユニークリスト」です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;・s = m + [i]&lt;br /&gt;　sは「掛け合わせた指数値のユニークリスト」に、それより到達した指数値iそのものを追加したリストです。&lt;br /&gt;　次の累乗値計算の元になる指数値のリストです。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;・t = len(s)&lt;br /&gt;　tは、リストsの次の累乗で生成できる累乗値までの掛け算回数の候補です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;・for j in s[::-1]:&lt;br /&gt;　for k in s[::-1]:&lt;br /&gt;　ループ変数jとループ変数kは、リストsから取り出した２つの要素です。&lt;br /&gt;　大きい値から順に、次の値を計算していきます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;・u = j + k&lt;br /&gt;　uは、次の掛け算で到達できる累乗値の指数です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;・if not (i &amp;lt; u&amp;nbsp; &amp;lt;= n2): break&lt;br /&gt;　i &amp;lt; u &amp;lt; n2 なら書き換え対象です。&lt;br /&gt;　そうでない場合は、kはそれ以下の値しかないので、条件は満たせずループは終了です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;・if 0 &amp;lt; M[u] &amp;lt; t: continue&lt;br /&gt;　0 &amp;lt; M[u] &amp;lt; tの場合、今までの結果よりも掛け算回数が少ないパターンなので、次のパターンを考えます。&lt;br /&gt;　そうでない場合、ここまでの処理結果よりも同じか長い掛け算回数のパターンなので処理続行です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;・if s in L[u]: continue&lt;br /&gt;　リストsは指数値uのときの「掛け合わせた指数値のユニークリスト」に既にあれば、次のパターンを考えます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;・L[u].append(s)&lt;br /&gt;　M[u] = t&lt;br /&gt;　ここまでくれば題意の満たす初めての「掛け合わせた指数値のユニークリスト」になので、掛け算回数tとともに保存します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;・return sum(M[n1:])&lt;br /&gt;　iのループが終了したところで、n1以上の掛け算回数の和を返却します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;解答はこのすぐ下の行です。文字の色を白にしてます。選択状態にすると見えます。&lt;br /&gt;&lt;span style=&quot;color: white;&quot;&gt;1582&lt;/span&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://sozorogusa.blogspot.com/feeds/3614116258368841719/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sozorogusa.blogspot.com/2017/03/blog-post_12.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/3614116258368841719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/3614116258368841719'/><link rel='alternate' type='text/html' href='http://sozorogusa.blogspot.com/2017/03/blog-post_12.html' title='プロジェクトオイラー　問１２２'/><author><name>こむ</name><uri>http://www.blogger.com/profile/10736571744712318490</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5705819268459585346.post-7653106533301821969</id><published>2017-03-10T21:27:00.000+09:00</published><updated>2017-03-10T21:27:03.273+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python"/><title type='text'>プロジェクトオイラー　問１２１</title><content type='html'>&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;プロジェクトオイラー(Project Euler)の問題をpythonでやってみます。&lt;br /&gt;日本語翻訳サイトは、プロジェクトオイラー日本語 でネット検索です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;問１２１「円盤ゲームの賞金額」&lt;br /&gt;袋の中に赤い円盤 1 枚と青い円盤 1 枚が入っている. &lt;br /&gt;ある賭けゲームにおいて, プレイヤーは円盤を 1 枚ランダムに取り出しその色を記録する.&lt;br /&gt;各ターンの終わりに円盤は袋に戻され, 追加の赤い円盤 1 枚が袋に足され, そして次の円盤がランダムに取り出される.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;プレイヤーはゲームをプレイするのに 1 ポンドを支払い, ゲーム終了時に青い円盤を赤い円盤より多く取り出していれば勝利する.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;ゲームが 4 ターンプレイされたとすると, プレイヤーが勝利する確率はちょうど11/120 となる.&lt;br /&gt;したがって, 胴元が赤字の見込みになるまでにこのゲームで勝ちに対して割り当てるべき賞金の最大は 10 ポンドとなるであろう.&lt;br /&gt;支払いはすべてポンドの整数倍であり, &lt;br /&gt;またゲームをプレイするのに支払われたもともとの 1 ポンドを含んでいるため,&lt;br /&gt;与えられた例では実際にはプレイヤーは 9 ポンドを獲得することに注意しよう.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;15 ターンがプレイされるゲーム 1 回に割り当てられるべき賞金の最大を求めよ.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;注意！！！&lt;br /&gt;自力で解きたい人へ&lt;br /&gt;以降の記述には解法に関するネタバレが含まれます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;私の回答例は以下の通りです。&lt;br /&gt;
&lt;/span&gt;&lt;pre class=&quot;brush:python;collapse:true&quot; title=&quot;問１２１&quot;&gt;
def mul(L): return reduce(lambda x,y: x*y, L)

def f(n):
&amp;#9;import itertools
&amp;#9;m = n//2 + 1
&amp;#9;c = 0
&amp;#9;L = [i+2 for i in xrange(n)]
&amp;#9;Ls = set(L)
&amp;#9;
&amp;#9;for i in xrange(m, n+1):
&amp;#9;&amp;#9;for t in itertools.combinations(L, i):
&amp;#9;&amp;#9;&amp;#9;u = Ls - set(t)
&amp;#9;&amp;#9;&amp;#9;if u: c += mul([s-1 for s in u])
&amp;#9;&amp;#9;&amp;#9;else: c += 1
&amp;#9;&amp;#9;&amp;#9;
&amp;#9;s = mul(L)//c
&amp;#9;return s
&amp;#9;
if __name__==&quot;__main__&quot;:
&amp;#9;print f(15)
&lt;/pre&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;１．関数f(n)&lt;br /&gt;・n回のターンで得られる賞金の最大値を求めます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;・m = n//2 + 1&lt;br /&gt;　mは勝利に必要な勝ち数です。n回のターンのうち半分以上で勝ちです。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;・L = [i+2 for i in xrange(n)]&lt;br /&gt;　Lは各ターンごとの全円盤数のリストです。&lt;br /&gt;　リストLのi番目の要素は、iターン目に円盤を取り出す確率の分母でもあります。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;・Ls = set(L)&lt;br /&gt;　Lsは全円盤数リストLを集合型にしたものです。後で集合演算で使います。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;・for i in xrange(m, n+1):&lt;br /&gt;　ループ変数iは勝ち数です。&lt;br /&gt;　必要な最低勝ち数mから全勝の場合のnまでの値を取ります。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;・for t in itertools.combinations(L, i):&lt;br /&gt;　ループ変数tは勝ち数iの場合に青円盤を取り出すターンでの全円盤数、の組み合わせです。&lt;br /&gt;　つまり、青円盤を取り出すターンごとのそれぞれの確率の分母の組み合わせでもあり、&lt;br /&gt;　各ターンごとの全円盤数リストLから、勝ち数i個の要素を取り出した組み合わせです。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;・u = Ls - set(t)&lt;br /&gt;　uは全円盤数リストLsからループ変数tの要素を集合演算で差し引いたリストです。&lt;br /&gt;　つまり、赤円盤を取り出すターンでの全円盤数、の組み合わせです。&lt;br /&gt;　これは、青円盤を取り出す１つのパターンの中で、異なる赤円盤を取り出す。場合の数です。&lt;br /&gt;　なので、uの要素を全部掛け合わせると、青円盤を取り出す１つのパターンの。場合の数になります。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;・if u: c += mul([s-1 for s in u])&lt;br /&gt;　else: c += 1&lt;br /&gt;　cは青円盤を取り出す１つのパターンの、場合の数の累積値です。&lt;br /&gt;　青円盤を取り出す1つのパターンの場合の数は、uの要素を全部掛け合わせた値なので&lt;br /&gt;　これを累積します。&lt;br /&gt;　ただし、全部青円盤、つまり全ターンで勝つ場合、赤円盤が出ないためリストuが空で&lt;br /&gt;積として計算できないので固定で１パターン分を累積します。&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;・s = mul(L)//c&lt;br /&gt;　return s&lt;br /&gt;　求める値sは１ゲーム当たりの最大賞金で、勝率の逆数です。&lt;br /&gt;　全部のパターン数を、勝ちパターン数で割った値の小数点以下切り捨て値です。&lt;br /&gt;　問題中の例の４ターンの場合、勝率11/120なので、最大賞金は120/11 = 10.9 ...で10です。&lt;br /&gt;　全部の場合の数は、各ターンごとの全円盤数の積です。&lt;br /&gt;　これを勝つパターン数cで割った値の整数値が、求める最大賞金です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;２．関数mul(L)&lt;br /&gt;・リストLの全要素の積です。&lt;a href=&quot;http://sozorogusa.blogspot.jp/2015/05/blog-post_23.html&quot;&gt;問１１０&lt;/a&gt;で作成した関数を流用しました。&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;解答はこのすぐ下の行です。文字の色を白にしてます。選択状態にすると見えます。&lt;br /&gt;&lt;span style=&quot;color: white;&quot;&gt;2269&lt;/span&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://sozorogusa.blogspot.com/feeds/7653106533301821969/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sozorogusa.blogspot.com/2017/03/blog-post_10.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/7653106533301821969'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/7653106533301821969'/><link rel='alternate' type='text/html' href='http://sozorogusa.blogspot.com/2017/03/blog-post_10.html' title='プロジェクトオイラー　問１２１'/><author><name>こむ</name><uri>http://www.blogger.com/profile/10736571744712318490</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5705819268459585346.post-6434519998297339709</id><published>2017-03-06T21:15:00.000+09:00</published><updated>2017-03-06T21:15:25.963+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python"/><title type='text'>プロジェクトオイラー　問１２０</title><content type='html'>&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;プロジェクトオイラー(Project Euler)の問題をpythonでやってみます。&lt;br /&gt;日本語翻訳サイトは、プロジェクトオイラー日本語 でネット検索です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;問１２０「自乗で割った余り」&lt;br /&gt;(a-1)&lt;sup&gt;n&lt;/sup&gt; + (a+1)&lt;sup&gt;n&lt;/sup&gt; を a&lt;sup&gt;2&lt;/sup&gt; で割った余りを r と定義する.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;例えば, a=7, n=3 の時, r=42 である: 6&lt;sup&gt;3&lt;/sup&gt; + 8&lt;sup&gt;3&lt;/sup&gt; = 728 ≡ 42 mod 49. &lt;br /&gt;n が変われば r も変わるが, a=7 の時 r の最大値 rmax は 42 であることがわかる.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;3 ≦ a ≦ 1000 において, Σ rmax を求めよ.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;注意！！！&lt;br /&gt;自力で解きたい人へ&lt;br /&gt;以降の記述には解法に関するネタバレが含まれます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;私の回答例は以下の通りです。&lt;br /&gt;
&lt;pre class=&quot;brush:python;collapse:true&quot; title=&quot;問１２０&quot;&gt;
def f(s, e): return sum([a*(a - (2- a%2)) for a in xrange(s, e+1)])
start, end = 3, 1000
print f(start, end)
&lt;/pre&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;まず、(a+1)&lt;sup&gt;n&lt;/sup&gt; + (a-1)&lt;sup&gt;n&lt;/sup&gt;　を展開してみます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;(a+1)&lt;sup&gt;n&lt;/sup&gt; + (a-1)&lt;sup&gt;n&lt;/sup&gt; ÷ a&lt;sup&gt;2&lt;/sup&gt; の余りについて、手計算して様子を見てみます。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;n=2のとき&lt;br /&gt;&amp;nbsp; (a+1)&lt;sup&gt;2&lt;/sup&gt; + (a-1)&lt;sup&gt;2&lt;/sup&gt;&lt;br /&gt;= (a&lt;sup&gt;2&lt;/sup&gt; + 2*a + 1) + (a&lt;sup&gt;2&lt;/sup&gt; - 2*a + 1)&lt;br /&gt;= 2(a&lt;sup&gt;2&lt;/sup&gt; + 1)&lt;br /&gt;なので、a&lt;sup&gt;2&lt;/sup&gt;で割った余りは、2です。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;n=3のとき&lt;br /&gt;&amp;nbsp; (a+1)&lt;sup&gt;3&lt;/sup&gt; + (a-1)&lt;sup&gt;3&lt;/sup&gt;&lt;br /&gt;= (a&lt;sup&gt;3&lt;/sup&gt; + 3*a&lt;sup&gt;2&lt;/sup&gt; + 3*a + 1) + (a&lt;sup&gt;3&lt;/sup&gt; - 3*a&lt;sup&gt;2&lt;/sup&gt; + 3*a - 1)&lt;br /&gt;= 2(a&lt;sup&gt;3&lt;/sup&gt; + 3*a)&lt;br /&gt;= 2(a&lt;sup&gt;n&lt;/sup&gt; * n*a)&lt;br /&gt;なので、a&lt;sup&gt;2&lt;/sup&gt;で割った余りは、2*n*aのa&lt;sup&gt;2&lt;/sup&gt;での余り、2*n*a÷a&lt;sup&gt;2&lt;/sup&gt;の余りです。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;n=4のとき&lt;br /&gt;&amp;nbsp; (a+1)&lt;sup&gt;4&lt;/sup&gt; + (a-1)&lt;sup&gt;4&lt;/sup&gt;&lt;br /&gt;= (a&lt;sup&gt;4&lt;/sup&gt; + 4*a&lt;sup&gt;3&lt;/sup&gt; + 6*a&lt;sup&gt;2&lt;/sup&gt; + 4*a + 1) + (a&lt;sup&gt;4&lt;/sup&gt; - 4*a&lt;sup&gt;3&lt;/sup&gt; + 6*a&lt;sup&gt;2&lt;/sup&gt; - 4*a + 1)&lt;br /&gt;= 2(a&lt;sup&gt;4&lt;/sup&gt; + 6*a&lt;sup&gt;2&lt;/sup&gt;) + 2&lt;br /&gt;なので、a&lt;sup&gt;2&lt;/sup&gt;での余りは、2です。&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;上記より、展開式をaの乗数の多い項から順に並べたとき、&lt;br /&gt;
・aの係数は二項係数でパスカルの三角形のそれぞれの値です。&lt;br /&gt;
・(a+1)と(a-1)のn乗同士をたすことで、偶数番目の項は互いに打ち消し合います。&lt;br /&gt;・題意からn≧3なので、aの2乗以上の項は全部割り切れ、余りはでません。&lt;br /&gt;
なので、&lt;br /&gt;
nが奇数の場合、余りはa&lt;sup&gt;1&lt;/sup&gt;の項だけみればよく、2*n*a÷(a&lt;sup&gt;2&lt;/sup&gt;)の余りです。&lt;br /&gt;
nが偶数の場合、余りはa&lt;sup&gt;0&lt;/sup&gt;の項だけみればよく、2です。&lt;br /&gt;
なので、nが奇数の場合だけ考えれば十分です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;割り算の余りは「割られる数」＝「割る数の倍数」のときに0になり、&lt;br /&gt;割られる数がこの値よりも小さいができるだけ大きな値というのが求める値です。&lt;br /&gt;
また、「割られる数」が「割る数」を超えると、&lt;br /&gt;それまでに出現した余りが再度循環して出現するので、&lt;br /&gt;「割られる数」が「割る数」以下の場合だけ考えれば十分です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;特に、「割られる数」＝「割る数」の場合、商が1で余り0。&lt;br /&gt;「割られる数」がこの値よりも小さいができるだけ大きな値の場合、&lt;br /&gt;商が0で残りが余りになり、「割られる数」＝「余り」になります。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;そこでまず、「割られる数」＝「余り」の場合のnを計算します。&lt;br /&gt;2an = a&lt;sup&gt;2&lt;/sup&gt;&lt;br /&gt;n = a/2&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;nがこの値よりも小さくできるだけ大きな値のとき、余りが最大になります。&lt;br /&gt;ところで、題意からnもaも整数なので、aが奇数か偶数かで場合分けが必要です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;(1)aが奇数の場合&lt;br /&gt;n = a/2よりも小さくできるだけ大きな値は、n = (a-1)/2 です。&lt;br /&gt;このときの求める値は、2an = 2a(a-1)/2 = a(a-1) です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;(2)aが偶数の場合&lt;br /&gt;n = a/2よりも小さくできるだけ大きな値は、n = (a-2)/2 です。&lt;br /&gt;このときの求める値は、2an = 2a(a-2)/2 = a(a-2) です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;aを奇数か偶数かで場合分けして上記の値を累計すればいいことになります。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;１．関数f(s, e)&lt;br /&gt;s以上e以下の値について、問題文にある最大値を返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;・sum([a*(a - (2- a%2)) for a in xrange(s, e+1)])&lt;br /&gt;　%演算子は余りなので、&lt;br /&gt;　「a%2」は、aが奇数なら1、偶数なら0です。&lt;br /&gt;　「2 - a%2」は、aが奇数なら1、偶数なら2です。&lt;br /&gt;　「a*(a - (2- a%2))」は、aが奇数ならa(a-1)、aが偶数ならa(a-2)　です。&lt;br /&gt;　sからeまで順にaのforループで上記の計算結果を配列に入れて、sum関数で合計します。&lt;br /&gt;　ループは内包表記をしています。&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;解答はこのすぐ下の行です。文字の色を白にしてます。選択状態にすると見えます。&lt;br /&gt;&lt;span style=&quot;color: white;&quot;&gt;333082500&lt;/span&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://sozorogusa.blogspot.com/feeds/6434519998297339709/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sozorogusa.blogspot.com/2017/03/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/6434519998297339709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/6434519998297339709'/><link rel='alternate' type='text/html' href='http://sozorogusa.blogspot.com/2017/03/blog-post.html' title='プロジェクトオイラー　問１２０'/><author><name>こむ</name><uri>http://www.blogger.com/profile/10736571744712318490</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5705819268459585346.post-9162275616166072692</id><published>2016-02-29T22:30:00.000+09:00</published><updated>2016-02-29T22:30:33.341+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python"/><title type='text'>プロジェクトオイラー　問１１９</title><content type='html'>&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;プロジェクトオイラー(Project Euler)の問題をpythonでやってみます。&lt;br /&gt;日本語翻訳サイトは、プロジェクトオイラー日本語 でネット検索です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;問１１９「数字べき乗和」&lt;br /&gt;512 という数は興味深い数である. &lt;br /&gt;というのも, 各桁の和を何乗かしたものに等しくなっているからである:&lt;br /&gt;5 + 1 + 2 = 8, 8&lt;sup&gt;3&lt;/sup&gt; = 512 である.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;この特性を持つ他の数は例えば 614656 = 28&lt;sup&gt;4&lt;/sup&gt;である.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;この数列の第 n 項を a&lt;sub&gt;n&lt;/sub&gt; と定義し, また 2 桁以上であるとしよう.&lt;br /&gt;a&lt;sub&gt;2&lt;/sub&gt; = 512, a&lt;sub&gt;10&lt;/sub&gt; = 614656 となる.&lt;br /&gt;a&lt;sub&gt;30&lt;/sub&gt; を求めよ.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;注意！！！&lt;br /&gt;自力で解きたい人へ&lt;br /&gt;以降の記述には解法に関するネタバレが含まれます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;私の回答例は以下の通りです。&lt;/span&gt;&lt;br /&gt;
&lt;pre class=&quot;brush:python;collapse:true&quot; title=&quot;問１１９&quot;&gt;
def f(n):
&amp;nbsp;c = 0
&amp;nbsp;for d in xrange(2, n+2):
&amp;nbsp;&amp;nbsp;for i in xrange(d, 9*d+1):
&amp;nbsp;&amp;nbsp;&amp;nbsp;for j in xrange(2, d+1):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a = i**j
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;t = [int(k) for k in str(a)]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if d==len(t) and i==sum(t):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c += 1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if c==n: return a, i, j
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
n = 30
s, i, j = f(n)
print s,&quot;( =&quot;, i, &quot;**&quot;, j, &quot;)&quot;
&lt;/pre&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;小さい数値から順に各桁を和を累乗して元の数になるかチェックすると、&lt;br /&gt;とても１分ルールに間に合いません。&lt;br /&gt;そこで、べき乗した数値を順に用意して元の数との桁数一致と各桁和をチェックします。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;１．関数f(n)&lt;br /&gt;・問題の数列の第n項の値を返します。&lt;br /&gt;　数列aの第1項から順にチェックして第n項を検出したときに処理を終了します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;・for d in xrange(2, n+2):&lt;br /&gt;　ループ変数dは求める値の桁数です。&lt;br /&gt;　取り得る値の範囲は、2桁以上で、第n項ではたかだかn+1桁です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;・for i in xrange(d, 9*d+1):&lt;br /&gt;　ループ変数iは、求める値a=i**jのときのiであり、また題意によりaの桁数和でもあります。&lt;br /&gt;　取り得る値の範囲はaが全桁1の数値ならばd、全桁9の数値ならば9*dなのでこの間です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;・for j in xrange(2, d+1):&lt;br /&gt;　ループ変数jは求める値a=i**jのときのj、べき乗です。&lt;br /&gt;　取り得る値の範囲は2乗以上なので最低2、べき乗数はたかだかaの全体桁数以内です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;・a = i**j&lt;br /&gt;　t = [int(k) for k in str(a)]&lt;br /&gt;　aは候補の値で、tは候補aの各桁の値リスト&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;・if d==len(t) and i==sum(t):&lt;br /&gt;　桁数一致、かつ元の数字＝数字のべき乗の桁数和が一致するかをチェックし、&lt;br /&gt;　成り立てば件数カウンタcを+1し、その件数が限度nになれば終了です。&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;&quot;&gt;解答はこのすぐ下の行です。文字の色を白にしてます。選択状態にすると見えます。&lt;br /&gt;&lt;span style=&quot;color: white;&quot;&gt;248155780267521 ( = 63 ** 8 )&lt;/span&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://sozorogusa.blogspot.com/feeds/9162275616166072692/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sozorogusa.blogspot.com/2016/02/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/9162275616166072692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/9162275616166072692'/><link rel='alternate' type='text/html' href='http://sozorogusa.blogspot.com/2016/02/blog-post.html' title='プロジェクトオイラー　問１１９'/><author><name>こむ</name><uri>http://www.blogger.com/profile/10736571744712318490</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5705819268459585346.post-5326104830785548451</id><published>2016-01-30T14:05:00.001+09:00</published><updated>2016-01-30T14:05:46.507+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python"/><title type='text'>プロジェクトオイラー　問１１８</title><content type='html'>&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;プロジェクトオイラー(Project Euler)の問題をpythonでやってみます。&lt;br /&gt;日本語翻訳サイトは、プロジェクトオイラー日本語 でネット検索です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;問１１８「パンデジタル素数集合」&lt;br /&gt;1 から 9 の全ての数字を使い, 自由につなげることで 10 進数の数字を作り,複数の集合を作ることができる. &lt;br /&gt;集合 {2,5,47,89,631} は面白いことに全ての要素が素数である.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;1 から 9 の数字をちょうど 1 個ずつ含み, 素数の要素しか含まない集合はいくつあるか?&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;注意！！！&lt;br /&gt;自力で解きたい人へ&lt;br /&gt;以降の記述には解法に関するネタバレが含まれます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;私の回答例は以下の通りです。&lt;br /&gt;
&lt;pre class=&quot;brush:python;collapse:true&quot; title=&quot;問１１８&quot;&gt;
def h(n):
&amp;nbsp;if n&amp;lt;2: return 0
&amp;nbsp;if n&amp;lt;4: return n
&amp;nbsp;if (not n%2): return 0
&amp;nbsp;for i in xrange(3, int(n**.5)+1, 2):
&amp;nbsp;&amp;nbsp;if not n%i: return 0
&amp;nbsp;return n

def f(L, Lc=[], d=0, cnt=0):
&amp;nbsp;if d==9:
&amp;nbsp;&amp;nbsp;return [], cnt+1
&amp;nbsp;bk = Lc[:]
&amp;nbsp;for i in xrange(len(L)):
&amp;nbsp;&amp;nbsp;Lc = bk[:]
&amp;nbsp;&amp;nbsp;s = 0
&amp;nbsp;&amp;nbsp;for j in L[i:]: s = s*10 + j

&amp;nbsp;&amp;nbsp;if Lc and Lc[0]&amp;lt;s: continue
&amp;nbsp;&amp;nbsp;if h(s):
&amp;nbsp;&amp;nbsp;&amp;nbsp;Lc.insert(0, s)
&amp;nbsp;&amp;nbsp;&amp;nbsp;Lc, cnt = f(L[:i], Lc, d+len(L)-i, cnt)
&amp;nbsp;&amp;nbsp;return Lc, cnt

import itertools
L0 = [i for i in xrange(1, 10)]
v = 0
for t in itertools.permutations(L0):
&amp;nbsp;L, c = f(t)
&amp;nbsp;v += c
print &quot;cnt:&quot;, v
&lt;/pre&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;1から9までの数字の順列を発生させ、その１つひとつについて、素数だけの要素に分解していきます。&lt;br /&gt;ただし、その分解できた要素の順番が異なっていても１つとして数えるため、要素が昇順に並んでいるパターンだけの件数を数えます。&lt;br /&gt;総当たりですが１分ルールは守れるのでよしとします。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;１．関数f(n)&lt;br /&gt;・リストLの要素を左から素数で区切り、累積用リストLcに格納していきます。&lt;br /&gt;　dは確定した全要素の合計桁数で、cntは全素数要素のパターン数です。&lt;br /&gt;　最終的に必要な値は件数だけですが、この関数を回帰呼び出しで使えるようにするために、戻り値は累積用リストLcと求める件数とします。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;・回帰呼び出しなので、最初は終了条件の記述が鉄則です。&lt;br /&gt;　確定した全要素の合計桁数が9ならば、1～9の数字の全部を使い切っていて、累積用リストLcに求めるパターンが格納されているので、空の累積用リストとカウンタcntを+1して戻ります。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;・累積用リストLcのバックアップを取ります。&lt;br /&gt;　左から1桁ずつ区切って要素を確定していく中で、区切り方が条件に合わない場合に直前状態に戻すためです。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;・for j in L[i:]: s = s*10 + j&lt;br /&gt;　位置iから右側を切り取り L[i:]とし、&lt;br /&gt;　jのforループ中で、1けたずつ取り出して10倍しながら足していき数値化しsとします。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;・if Lc and Lc[0]&amp;lt;s: continue&lt;br /&gt;　重複を避けるため、全要素が昇順になる場合だけ採用し、それ以外は次へ。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;・if h(s):&lt;br /&gt;　　Lc.insert(0, s)&lt;br /&gt;　　Lc, cnt = f(L[:i], Lc, d+len(L)-i, cnt)&lt;br /&gt;　関数hで数値sの素数判定します。&lt;br /&gt;　素数ならば、累積用リストLcに右から追加します。&lt;br /&gt;　そしてリストLの位置iから左側L[:i]について、当関数fを再起呼び出しして、さらに素数の要素があるか探索します。&lt;br /&gt;　&amp;nbsp;&lt;br /&gt;２．関数h(n)&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;・&lt;a href=&quot;http://sozorogusa.blogspot.jp/2015_06_01_archive.html&quot;&gt;問１１１&lt;/a&gt;の素数判定を改良しました。&lt;br /&gt;　2未満に素数は無く、2と3は素数。ここまではif文で直接判定します。&lt;br /&gt;　その後は偶数を外し、3から先の奇数の倍数を外します。&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;解答はこのすぐ下の行です。文字の色を白にしてます。選択状態にすると見えます。&lt;br /&gt;&lt;span style=&quot;color: white;&quot;&gt;44680&lt;/span&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://sozorogusa.blogspot.com/feeds/5326104830785548451/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sozorogusa.blogspot.com/2016/01/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/5326104830785548451'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/5326104830785548451'/><link rel='alternate' type='text/html' href='http://sozorogusa.blogspot.com/2016/01/blog-post.html' title='プロジェクトオイラー　問１１８'/><author><name>こむ</name><uri>http://www.blogger.com/profile/10736571744712318490</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5705819268459585346.post-4977766527415109452</id><published>2015-11-14T09:32:00.000+09:00</published><updated>2015-11-14T09:32:54.530+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python"/><title type='text'>プロジェクトオイラー　問１１７</title><content type='html'>&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;プロジェクトオイラー(Project Euler)の問題をpythonでやってみます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;日本語翻訳サイトは、プロジェクトオイラー日本語 でネット検索です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;問１１７「赤タイル, 緑タイル, そして青タイル」&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;黒い正方形のタイルと,&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;2 ユニットの長さの赤のタイル,&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;3 ユニットの長さの緑のタイル,&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;4 ユニットの長さの青のタイルから選んで組み合わせて,&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;5 ユニットの長さの 1 列をタイルで敷く方法はちょうど 15 通りある.&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwfKNlsKEhpeNcQH_p-3LZoASV0uh_Olk__QCBcnKuwz6_QxIHe4DLoeYqJ37S1AB7N8KoV82-gh9WnqVo4hKhiEgCNqq0A92Gu2LKpKrp9x4MI93yTZm2GAedA_W7E64Fbv0xsc27f7E/s1600/p117_1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;153&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwfKNlsKEhpeNcQH_p-3LZoASV0uh_Olk__QCBcnKuwz6_QxIHe4DLoeYqJ37S1AB7N8KoV82-gh9WnqVo4hKhiEgCNqq0A92Gu2LKpKrp9x4MI93yTZm2GAedA_W7E64Fbv0xsc27f7E/s320/p117_1.png&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;長さ 50 ユニットの 1 列をタイルで敷く方法は何通りあるか.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;注: この問題は &lt;a href=&quot;http://sozorogusa.blogspot.jp/2015/10/blog-post.html&quot;&gt;Problem 116&lt;/a&gt; に関連する&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;注意！！！&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;自力で解きたい人へ&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;以降の記述には解法に関するネタバレが含まれます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;私の回答例は以下の通りです。&lt;/span&gt;&lt;br /&gt;
&lt;pre class=&quot;brush:python;collapse:true&quot; title=&quot;問１１７&quot;&gt;
def e(n, m, d):
&amp;#9;if n not in d:
&amp;#9;&amp;#9;d[n] = sum([e(n-i, m, d) for i in xrange(1, m+1)])
&amp;#9;return d[n]

def f(n, m):
&amp;#9;d = {0:0}
&amp;#9;for i in xrange(1, m+1): d[i] = e(i, i-1, d)+1
&amp;#9;return e(n, m, d)

n = 50
m = 4
s = f(n, m)
print s
&lt;/pre&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;4個以下の長さのブロック4種類を使って一列にタイルを敷きます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;パターン数辞書dに使うタイルの分の初期化をして求めます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;１．関数e(n, m, d):&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・全体がn個で、m個以下のブロックからできているパターン数を返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・dは全体がn個の場合のパターン数の辞書（連想配列）です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　1度計算した値はこの辞書に格納して重複して計算しないようにします。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・全体がn個になる場合のパターン数は、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　ループ変数iが1からmまで１つずつ変化しながら、&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;全体がn-i個の状態の直後にi個ブロックを1つ置く場合のパターン数の累積値です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;２．関数f(n, m)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・全体がn個で、m個以下のブロックからできているパターン数を返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・まず、パターン数辞書の初期状態を準備します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　キー=0の場合、パターン数は0です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・d[n] = e(i, i-1, d)+1&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　0&amp;lt;キーi&amp;lt;mの場合、パターン数は全体がi個で、i-1個以下の長さのブロックからできているパターン数と&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;i個ブロック1つだけ置くパターン数1の和です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・ここまででパターン数辞書の初期状態が準備できたら、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　関数e(n, m, d)が求める値なので、これを求めて返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;解答はこのすぐ下の行です。文字の色を白にしてます。選択状態にすると見えます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: white; font-family: Courier New, Courier, monospace;&quot;&gt;100808458960497&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sozorogusa.blogspot.com/feeds/4977766527415109452/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sozorogusa.blogspot.com/2015/11/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/4977766527415109452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/4977766527415109452'/><link rel='alternate' type='text/html' href='http://sozorogusa.blogspot.com/2015/11/blog-post.html' title='プロジェクトオイラー　問１１７'/><author><name>こむ</name><uri>http://www.blogger.com/profile/10736571744712318490</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwfKNlsKEhpeNcQH_p-3LZoASV0uh_Olk__QCBcnKuwz6_QxIHe4DLoeYqJ37S1AB7N8KoV82-gh9WnqVo4hKhiEgCNqq0A92Gu2LKpKrp9x4MI93yTZm2GAedA_W7E64Fbv0xsc27f7E/s72-c/p117_1.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5705819268459585346.post-6515490121739074537</id><published>2015-10-11T20:24:00.000+09:00</published><updated>2015-10-11T20:24:35.324+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python"/><title type='text'>プロジェクトオイラー　問１１６（別解）</title><content type='html'>&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;プロジェクトオイラー(Project Euler)の問題をpythonでやってみます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;日本語翻訳サイトは、プロジェクトオイラー日本語 でネット検索です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;問１１６「赤タイル, 緑タイル, あるいは青タイル」&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;5 個の黒い正方形のタイルの列を, 赤(長さ 2), 緑(長さ 3), 青(長さ 4)から選んで,&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;この色のついた長方形のタイルでいくつか置き換える.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;もし赤のタイルを選んだ場合は, ちょうど 7 通りの方法がある.&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRsGvjWBfVhCxsjxOL7ej1uOi7E2qqcOtbkyY9foUMdvW5BhGpJ99LmAWBtrjSX4jotnKm6038wzo7W43SJkC23pAJKIRxlCoVoH5FtSIxvRiaHHXZzTJDI0WKU1PMsSfDciThQKgyqUI/s1600/p116_1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;80&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRsGvjWBfVhCxsjxOL7ej1uOi7E2qqcOtbkyY9foUMdvW5BhGpJ99LmAWBtrjSX4jotnKm6038wzo7W43SJkC23pAJKIRxlCoVoH5FtSIxvRiaHHXZzTJDI0WKU1PMsSfDciThQKgyqUI/s320/p116_1.png&quot; width=&quot;530&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;もし緑のタイルを選んだ場合は, 3 通りである.&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNdmE0Fh92BbFShyphenhyphenZqZ2LmobDKI95hwMw2EGn5XpENmOlDmY-n4bJz3AvTrBgjMGw_lXRnb7VDkKJ4cGOZ1kwOI8HKFE_beXpLFFoWD6f9HI1Ba6vz8NsciB6NAWpqLeyUd3F6vJq6tLE/s1600/p116_2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;40&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNdmE0Fh92BbFShyphenhyphenZqZ2LmobDKI95hwMw2EGn5XpENmOlDmY-n4bJz3AvTrBgjMGw_lXRnb7VDkKJ4cGOZ1kwOI8HKFE_beXpLFFoWD6f9HI1Ba6vz8NsciB6NAWpqLeyUd3F6vJq6tLE/s320/p116_2.png&quot; width=&quot;430&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;もし青のタイルを選んだ場合は, 2 通りである.&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUFzby1kfx0E3qsvi3KeRLCdASBLsVWqy5iI1dK9yX9YD5rrhnCWaHXf7woXhkqTKvAzhyphenhyphenHbR6TXxp8ubZGAjBI79xS8KRwaaYUT-ysWhApM2XKU6SwZo_4Np2wM8X0xuVGB8lipvWHy4/s1600/p116_3.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUFzby1kfx0E3qsvi3KeRLCdASBLsVWqy5iI1dK9yX9YD5rrhnCWaHXf7woXhkqTKvAzhyphenhyphenHbR6TXxp8ubZGAjBI79xS8KRwaaYUT-ysWhApM2XKU6SwZo_4Np2wM8X0xuVGB8lipvWHy4/s1600/p116_3.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;複数の色を混ぜられない場合は, 5 ユニットの長さの 1 列に並んだ黒いタイルを置き換える方法は 7 + 3 + 2 = 12 通りある.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;50 ユニットの長さの 1 列に並んだ黒いタイルを置き換える方法は何通りあるか.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;ただし複数の色を混ぜることはできず, 少なくとも 1 個は色のついたタイルを使うこと.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;注: この問題は Problem 117 に関連する&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;注意！！！&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;自力で解きたい人へ&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;以降の記述には解法に関するネタバレが含まれます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;私の回答例は以下の通りです。&lt;/span&gt;&lt;br /&gt;
&lt;pre class=&quot;brush:python;collapse:true&quot; title=&quot;問１１６別解&quot;&gt;
def e(m, n, d):
&amp;#9;if n not in d:
&amp;#9;&amp;#9;d[n] = e(m, n-1, d)+e(m, n-m, d)
&amp;#9;return d[n]

def dd(n):
&amp;#9;d = {0:0, n:2}
&amp;#9;for i in xrange(1, n): d[i] = 1
&amp;#9;return d

def f(n, t):
&amp;#9;s = 0
&amp;#9;for m in t:
&amp;#9;&amp;#9;d = dd(m)
&amp;#9;&amp;#9;s += e(m, n, d) -1
&amp;#9;return s

n = 50
t = 2,3,4
s = f(n, t)
print s
&lt;/pre&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;前回の解法は、問１１４、１１５を参考に続けて考えたため、&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;終端のブロックが1個かm個かによって関数end1()とendm()として関数を分けていましたが、&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;1個ブロックもm個ブロックもその後にどちらを置いてもいいので本質的に違いはありません。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;そこで、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;関数end1()とendm()を統合して、終端のブロック数に関係しない関数e()として別解を作成しました。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;１．関数e(m, n, d)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・全体がn個で、1個とm個のブロックからできているパターン数を返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・dは全体がn個の場合のパターン数の辞書（連想配列）です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　1度計算した値はこの辞書に格納して重複して計算しないようにします。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・全体がn個になる場合のパターン数は、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　全体がn-1個の後に1個ブロックを1つ置く場合と&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　全体がn-m個の後にm個ブロックを1つ置く場合の２系統あるので、この和になります。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;２．関数dd(n)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・n個ブロックを使用する場合のパターン数辞書の初期状態を返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　1個ブロックとn個ブロックの両方があることを考慮します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・具体的には以下のとおりです。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　キー=nの場合、1個ブロックn個連続またはm個ブロック1個の場合なのでパターン数は2、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　0&amp;lt;キー&amp;lt;nの場合、1ブロックが連続しているパターンだけなのでパターン数は1、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　キー=0の場合、パターン数は0となります。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;３．関数f(n, t)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・全体のブロック数nのときの求めるパターン数を返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　ただし、引数tは1個ブロックとともに使用するm個ブロックのmに相当する数のタプルです。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　本問では赤(長さ 2), 緑(長さ 3), 青(長さ 4)を使用するので、t=2,3,4となります。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・ループ変数mとして引数tから値を１つずつ取り出します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・パターン数辞書をdとして、関数dd()で初期化した状態で準備します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・mの値ごとに関数e()でパターン数を求め、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　全部1個ブロックの場合は数えないのでそのパターン数1を引きます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・上記を使用するm個ブロックの分だけ累積します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;解答はこのすぐ下の行です。文字の色を白にしてます。選択状態にすると見えます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: white; font-family: Courier New, Courier, monospace;&quot;&gt;20492570929&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://sozorogusa.blogspot.com/feeds/6515490121739074537/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sozorogusa.blogspot.com/2015/10/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/6515490121739074537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/6515490121739074537'/><link rel='alternate' type='text/html' href='http://sozorogusa.blogspot.com/2015/10/blog-post.html' title='プロジェクトオイラー　問１１６（別解）'/><author><name>こむ</name><uri>http://www.blogger.com/profile/10736571744712318490</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRsGvjWBfVhCxsjxOL7ej1uOi7E2qqcOtbkyY9foUMdvW5BhGpJ99LmAWBtrjSX4jotnKm6038wzo7W43SJkC23pAJKIRxlCoVoH5FtSIxvRiaHHXZzTJDI0WKU1PMsSfDciThQKgyqUI/s72-c/p116_1.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5705819268459585346.post-5545242028846020263</id><published>2015-09-13T21:08:00.000+09:00</published><updated>2015-10-11T20:22:45.316+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python"/><title type='text'>プロジェクトオイラー　問１１６</title><content type='html'>&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;プロジェクトオイラー(Project Euler)の問題をpythonでやってみます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;日本語翻訳サイトは、プロジェクトオイラー日本語 でネット検索です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;問１１６「赤タイル, 緑タイル, あるいは青タイル」&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;5 個の黒い正方形のタイルの列を, 赤(長さ 2), 緑(長さ 3), 青(長さ 4)から選んで,&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;この色のついた長方形のタイルでいくつか置き換える.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;もし赤のタイルを選んだ場合は, ちょうど 7 通りの方法がある.&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRsGvjWBfVhCxsjxOL7ej1uOi7E2qqcOtbkyY9foUMdvW5BhGpJ99LmAWBtrjSX4jotnKm6038wzo7W43SJkC23pAJKIRxlCoVoH5FtSIxvRiaHHXZzTJDI0WKU1PMsSfDciThQKgyqUI/s1600/p116_1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;80&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRsGvjWBfVhCxsjxOL7ej1uOi7E2qqcOtbkyY9foUMdvW5BhGpJ99LmAWBtrjSX4jotnKm6038wzo7W43SJkC23pAJKIRxlCoVoH5FtSIxvRiaHHXZzTJDI0WKU1PMsSfDciThQKgyqUI/s320/p116_1.png&quot; width=&quot;530&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;もし緑のタイルを選んだ場合は, 3 通りである.&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNdmE0Fh92BbFShyphenhyphenZqZ2LmobDKI95hwMw2EGn5XpENmOlDmY-n4bJz3AvTrBgjMGw_lXRnb7VDkKJ4cGOZ1kwOI8HKFE_beXpLFFoWD6f9HI1Ba6vz8NsciB6NAWpqLeyUd3F6vJq6tLE/s1600/p116_2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;40&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNdmE0Fh92BbFShyphenhyphenZqZ2LmobDKI95hwMw2EGn5XpENmOlDmY-n4bJz3AvTrBgjMGw_lXRnb7VDkKJ4cGOZ1kwOI8HKFE_beXpLFFoWD6f9HI1Ba6vz8NsciB6NAWpqLeyUd3F6vJq6tLE/s320/p116_2.png&quot; width=&quot;430&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;もし青のタイルを選んだ場合は, 2 通りである.&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUFzby1kfx0E3qsvi3KeRLCdASBLsVWqy5iI1dK9yX9YD5rrhnCWaHXf7woXhkqTKvAzhyphenhyphenHbR6TXxp8ubZGAjBI79xS8KRwaaYUT-ysWhApM2XKU6SwZo_4Np2wM8X0xuVGB8lipvWHy4/s1600/p116_3.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUFzby1kfx0E3qsvi3KeRLCdASBLsVWqy5iI1dK9yX9YD5rrhnCWaHXf7woXhkqTKvAzhyphenhyphenHbR6TXxp8ubZGAjBI79xS8KRwaaYUT-ysWhApM2XKU6SwZo_4Np2wM8X0xuVGB8lipvWHy4/s1600/p116_3.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;複数の色を混ぜられない場合は, 5 ユニットの長さの 1 列に並んだ黒いタイルを置き換える方法は 7 + 3 + 2 = 12 通りある.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;50 ユニットの長さの 1 列に並んだ黒いタイルを置き換える方法は何通りあるか.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;ただし複数の色を混ぜることはできず, 少なくとも 1 個は色のついたタイルを使うこと.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;注: この問題は Problem 117 に関連する&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;注意！！！&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;自力で解きたい人へ&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;以降の記述には解法に関するネタバレが含まれます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;私の回答例は以下の通りです。&lt;/span&gt;&lt;br /&gt;
&lt;pre class=&quot;brush:python;collapse:true&quot; title=&quot;問１１６&quot;&gt;
def end1(m, n, d1, dm):
&amp;#9;if n not in d1:
&amp;#9;&amp;#9;d1[n] = end1(m, n-1, d1, dm)+endm(m, n-1, d1, dm)
&amp;#9;return d1[n]

def endm(m, n, d1, dm):
&amp;#9;if n not in dm:
&amp;#9;&amp;#9;dm[n] = end1(m, n-m, d1, dm)+endm(m, n-m, d1, dm)
&amp;#9;return dm[n]

def dd(n):
&amp;#9;d = {n:1}
&amp;#9;for i in xrange(n): d[i] = 0
&amp;#9;return d

def f(n, t):
&amp;#9;s = 0
&amp;#9;for m in t:
&amp;#9;&amp;#9;d1, dm = dd(1), dd(m)
&amp;#9;&amp;#9;s += end1(m, n, d1, dm) + endm(m, n, d1, dm) -1
&amp;#9;return s

n = 50
t = 2,3,4
s = f(n, t)
print s
&lt;/pre&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;問１１４、１１５との違いは以下です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;a.m個ブロックも1個ブロックと同様に連続してよい。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;b.最低1つは色ブロックが必要。つまり、全部黒1個のパターンは数えない。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;c.黒1個ブロックの他に3色あり、3色は混ぜられない。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;そこで、問１１５で作成した、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;全体がn個で終端が黒ブロックのパターン数の関数endb()と&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;同終端が赤ブロックの関数endr()に基づいて、それぞれ、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;全体がn個で終端が1個ブロックのパターン数を関数end1()と&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;同終端がm個ブロックの関数endm()として調整します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;上記aの対応で、endm()は全体個数がn-m個のときのend1()とendm()の和になります。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;上記bの対応で、f()では全部が1個ブロックの場合の1パターン分、減らします。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;上記cの対応で、3色別々に計算し、合計します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;１．関数end1(m, n, d1, dm)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・全体がn個で、1個とm個のブロックからできていて末尾が1個ブロックのパターン数を返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・問１１５の関数endb()の変数名を変更しただけでまったく同じ関数です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・d1は終端が1個ブロックで全体がn個の場合のパターン数の辞書（連想配列）です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　dmは終端がm個ブロックで全体がn個の場合のパターン数の辞書（連想配列）です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　いずれも1度計算した値はこれらの辞書に格納して重複して計算しないようにします。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・終端に1個ブロックを置いて全体がn個になる場合のパターン数は、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　全体がn-1個で終端が1個ブロック、m個ブロックのときのパターン数の和になります。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;２．関数endm(m, n, d1, dm)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・全体がn個で、1個とm個のブロックからできていて末尾がm個ブロックのパターン数を返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・d1、dmは関数end1のときと同様です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・終端にm個ブロックを置いて全体がn個になる場合のパターン数は、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　全体がn-m個で終端が1個ブロック、m個ブロックのときのパターン数の和になります。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;３．関数dd(n)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・n個ブロックを使用する場合のパターン数辞書の初期状態を返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　具体的には、キー=nの値が1で、キー&amp;lt;nの値が0である辞書（連想配列）を返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;４．関数f(n, t)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・全体のブロック数nのときの求めるパターン数を返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　ただし、引数tは1個ブロックとともに使用するm個ブロックのmに相当する数のタプルです。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　本問では赤(長さ 2), 緑(長さ 3), 青(長さ 4)を使用するので、t=2,3,4となります。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・ループ変数mとして引数tから値を１つずつ取り出します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・d1、dmとして、終端が1個ブロックとm個ブロックのパターン数辞書を&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　関数dd()で初期化した状態で準備します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・mの値ごとに、終端が1個ブロックの場合と終端がm個ブロックの場合の、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　それぞれのパターン数を関数end1()、関数endm()で求めて合計し、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　全部1個ブロックの場合は数えないのでそのパターン数1を引きます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・上記を使用するm個ブロックの分だけ累積します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;解答はこのすぐ下の行です。文字の色を白にしてます。選択状態にすると見えます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white; color: white; font-family: Courier New, Courier, monospace;&quot;&gt;20492570929&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://sozorogusa.blogspot.com/feeds/5545242028846020263/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sozorogusa.blogspot.com/2015/09/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/5545242028846020263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/5545242028846020263'/><link rel='alternate' type='text/html' href='http://sozorogusa.blogspot.com/2015/09/blog-post.html' title='プロジェクトオイラー　問１１６'/><author><name>こむ</name><uri>http://www.blogger.com/profile/10736571744712318490</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRsGvjWBfVhCxsjxOL7ej1uOi7E2qqcOtbkyY9foUMdvW5BhGpJ99LmAWBtrjSX4jotnKm6038wzo7W43SJkC23pAJKIRxlCoVoH5FtSIxvRiaHHXZzTJDI0WKU1PMsSfDciThQKgyqUI/s72-c/p116_1.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5705819268459585346.post-3385163543980628148</id><published>2015-08-23T14:17:00.000+09:00</published><updated>2015-08-23T14:17:51.224+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python"/><title type='text'>プロジェクトオイラー　問１１５</title><content type='html'>&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;プロジェクトオイラー(Project Euler)の問題をpythonでやってみます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;日本語翻訳サイトは、プロジェクトオイラー日本語 でネット検索です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;問１１５「ブロックの組み合わせ方の数え上げ その2」&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;注意: これは Problem 114 をより難しくした問題である.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;長さ n ユニットからなる 1 列上に, 最低 m ユニットの長さを持つ赤ブロックが置かれている.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;ただしどの赤ブロック同士も, 少なくとも 1 ユニットの黒い正方形が間にある(赤ブロックは長さが異なってもよい).&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;敷き詰め計数関数 F(m, n) は 1 列に敷き詰める方法が何通りかを表すとする.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;例えば, F(3, 29) = 673135 であり, F(3, 30) = 1089155 である.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;m = 3 の時, n = 30 がこの敷き詰め計数関数が初めて 1,000,000 を超える最小の値であることがわかる.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;同様に, m = 10 では F(10, 56) = 880711, F(10, 57) = 1148904 であることがわかり, つまり n = 57 がこの敷き詰め計数関数が初めて 1,000,000 を超える最小の値であることがわかる.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;m = 50 のとき, この敷き詰め計数関数が初めて 1,000,000 を超える最小の n の値を求めよ.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;注意！！！&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;自力で解きたい人へ&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;以降の記述には解法に関するネタバレが含まれます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;私の回答例は以下の通りです。&lt;/span&gt;&lt;br /&gt;
&lt;pre class=&quot;brush:python;collapse:true&quot; title=&quot;問１１５&quot;&gt;
def endb(m, n, bd, rd):
&amp;#9;if n not in bd:
&amp;#9;&amp;#9;bd[n] = endb(m, n-1, bd, rd) + endr(m, n-1, bd, rd)
&amp;#9;return bd[n]

def endr(m, n, bd, rd):
&amp;#9;if n not in rd:
&amp;#9;&amp;#9;rd[n] = 1 + sum([endb(m, i,bd,rd) for i in xrange(n-m+1)])
&amp;#9;return rd[n]

def f(m, k):
&amp;#9;bd = {0:0, 1:1}
&amp;#9;rd = {m:1}
&amp;#9;for i in xrange(m): rd[i] = 0

&amp;#9;n = 0
&amp;#9;while endb(m, n, bd, rd)+endr(m, n, bd, rd)&amp;lt;=k: n += 1
&amp;#9;return n


m=50
k = 1000000
n = f(m, k)
print n
&lt;/pre&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;a href=&quot;http://sozorogusa.blogspot.jp/2015/08/blog-post_20.html&quot;&gt;問１１４&lt;/a&gt;との違いは、以下の２点です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;a.赤ブロックの最小個数が3個固定だったのがm個になったこと。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;b.全体の長さを固定にしてパターン数を求めていたことに対して&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　パターン数の下限値から全体の長さの最小値を求めること。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;そこで、問１１４で作成した、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;全体がn個で終端が黒ブロックのパターン数の関数endb()、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;同赤ブロックの関数endr()を上記aに対応できるように改良し、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;求める値を返すf()も上記bに合わせて改良します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;１．関数endb(m, n, bd, rd)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・赤ブロックが最小m個、全体がn個で終端が黒ブロックのパターン数を返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・問１１４の関数endb()に引数mを追加し、呼び出す関数endr()も問１１４のものに&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;引数mを追加するので、それに合わせました。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・bdは終端が黒で全体がn個の場合のパターン数の辞書（連想配列）です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　rdは終端が赤で全体がn個の場合のパターン数の辞書（連想配列）です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　いずれも1度計算した値はこれらの辞書に格納して重複して計算しないようにします。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・終端に黒ブロックを置いて全体がn個になる場合、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　全体がn-1個で終端が赤でも黒でも置けるので、これらのパターン数の和になります。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;２．関数endr(m, n, bd, rd)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・赤ブロックが最小m個、全体がn個で終端が赤ブロックのパターン数を返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・問１１４の関数endb()に引数mを追加し、固定値2の部分をm-1に改良しました。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・bd、rdは関数endbのときと同様です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・終端に赤ブロックを置いて全体がn個になる場合は以下の２つの場合があります。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　a.まだ何も置いていなくて長さn個の赤ブロックを置く場合&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　b.端が黒でn個まで2個以上のすきまがあり、すきまの長さ+1個の赤ブロックを置く場合&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　　この場合、置く直前のブロックは黒ブロックの場合だけなのでendb関数を呼び出します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　aの場合は1パターンなので赤辞書rdのキーnの初期値に1として設定します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　bの場合はループ変数iを0からnのm個手前まで回して、長さiの黒ブロックで終わって&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;長さn-iの赤ブロックを1つ置くパターン数を足します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;３．関数f(m, k)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・赤ブロックの最小個数mで問題の条件に合うパターン数が下限値k個を超える、全体の長さの最小値を返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・bd、rdは関数endbのときと同様です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　最小の長さが、黒は1個で、赤はm個なので、&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;黒赤それぞれでその値未満のパターン数は0で、その値で1パターンが初期値になります。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　なお、辞書rdには、&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;キーmのとき1を固定で設定し、m未満のキーのときはfor文で回して0を設定します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・黒赤それぞれのが終端となるパターン数の和が全パターン数です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　全体の長さnは0から始めて1ずつ増加させながら全パターン数を計算していき、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　この全パターン数が下限値kを超えたら、そのときのnを返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;解答はこのすぐ下の行です。文字の色を白にしてます。選択状態にすると見えます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: white; font-family: Courier New, Courier, monospace;&quot;&gt;168&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://sozorogusa.blogspot.com/feeds/3385163543980628148/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sozorogusa.blogspot.com/2015/08/blog-post_23.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/3385163543980628148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/3385163543980628148'/><link rel='alternate' type='text/html' href='http://sozorogusa.blogspot.com/2015/08/blog-post_23.html' title='プロジェクトオイラー　問１１５'/><author><name>こむ</name><uri>http://www.blogger.com/profile/10736571744712318490</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5705819268459585346.post-1931926814157454370</id><published>2015-08-20T16:30:00.000+09:00</published><updated>2015-08-20T16:30:52.912+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python"/><title type='text'>プロジェクトオイラー　問１１４</title><content type='html'>&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;プロジェクトオイラー(Project Euler)の問題をpythonでやってみます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;日本語翻訳サイトは、プロジェクトオイラー日本語 でネット検索です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;問１１４「ブロックの組み合わせ方の数え上げ その1」&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;長さ 7 ユニットからなる 1 列上に, 最低 3 ユニットの長さを持つ赤ブロックが置かれている.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;ただしどの赤ブロック同士も, 少なくとも 1 ユニットの黒い正方形が間にある(赤ブロックは長さが異なってもよい).&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;これを敷き詰める方法は, ちょうど 17 通りある.&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNK1CsSPbidvZx9DKomwWp5c-2EcaYiAbFeo71zuo6k9D6nei5VeJ6GLKitJkFh8GPRe-rO9JNyz15uVi_y6KtWiUaLV8F3XdViVvu_TibQcxIz7LPm2dwB2P8CRQWLDz-I-ugEGqSO0k/s1600/p114_1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;135&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNK1CsSPbidvZx9DKomwWp5c-2EcaYiAbFeo71zuo6k9D6nei5VeJ6GLKitJkFh8GPRe-rO9JNyz15uVi_y6KtWiUaLV8F3XdViVvu_TibQcxIz7LPm2dwB2P8CRQWLDz-I-ugEGqSO0k/s320/p114_1.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;50 ユニットの長さの 1 列を敷き詰める方法は何通りあるか.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;注意: 上の例では起こりえないが, 通常はブロックの大きさが複数混ざっていてもよい.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;例えば, 8 ユニットの長さの 1 列では, 赤(3), 黒(1), 赤(4) を使うことができる.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;注意！！！&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;自力で解きたい人へ&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;以降の記述には解法に関するネタバレが含まれます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;私の回答例は以下の通りです。&lt;/span&gt;&lt;br /&gt;
&lt;pre class=&quot;brush:python;collapse:true&quot; title=&quot;問１１４&quot;&gt;
def endb(n, bd, rd):
&amp;#9;if n not in bd:
&amp;#9;&amp;#9;bd[n] = endb(n-1, bd, rd) + endr(n-1, bd, rd)
&amp;#9;return bd[n]

def endr(n, bd, rd):
&amp;#9;if n not in rd:
&amp;#9;&amp;#9;rd[n] = 1 + sum([endb(i,bd,rd) for i in xrange(n-2)])
&amp;#9;return rd[n]

def f(n):
&amp;#9;bd, rd = {0:0, 1:1}, {0:0, 1:0, 2:0, 3:1}
&amp;#9;return endb(n, bd, rd) + endr(n, bd, rd)

n=50
s = f(n)
print s
&lt;/pre&gt;&lt;/br&gt;
&lt;/br&gt;
&lt;/br&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;黒ブロック（長さ１個）または赤ブロック（長さ３個以上）を１つずつ置いていって個数を数えます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;ただし、赤ブロックは連続では置けないので、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;順番に並べていく中で終端が赤か黒かで別々の関数にします。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;１．関数endb(n, bd, rd)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・全体がn個で終端が黒ブロックのパターン数を返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・bdは終端が黒で全体がn個の場合のパターン数の辞書（連想配列）です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　rdは終端が赤で全体がn個の場合のパターン数の辞書（連想配列）です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　いずれも1度計算した値はこれらの辞書に格納して重複して計算しないようにします。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・終端に黒ブロックを置いて全体がn個になる場合、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　全体がn-1個で終端が赤でも黒でも置けるので、これらのパターン数の和になります。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;２．関数endr(n, bd, rd)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・全体がn個で終端が黒ブロックのパターン数を返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・bd、rdは関数endbのときと同様です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・終端に赤ブロックを置いて全体がn個になる場合は以下の２つの場合があります。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　a.まだ何も置いていなくて長さn個の赤ブロックを置く場合&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　b.端が黒でn個まで2個以上のすきまがあり、すきまの長さ+1個の赤ブロックを置く場合&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　　この場合、置く直前のブロックは黒ブロックの場合だけなのでendb関数を呼び出します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　aの場合は1パターンなので赤辞書rdのキーnの初期値に1として設定します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　bの場合はループ変数iを0からnの3つ手前まで回して、長さiの黒ブロックで終わって長さn-iの赤ブロックを1つ置くパターン数を足します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;３．関数f(n)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・問題の条件で長さnで1列を敷き詰めるパターン数を返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・bd、rdは関数endbのときと同様です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　最小の長さは黒が1個で赤が3個なので、黒赤それぞれでこの値未満のパターン数は0で、その値で1パターンというのが初期値になります。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・黒赤それぞれのが終端となるパターン数の和が、求めるパターン数です。&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;解答はこのすぐ下の行です。文字の色を白にしてます。選択状態にすると見えます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: white; font-family: Courier New, Courier, monospace;&quot;&gt;16475640049&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://sozorogusa.blogspot.com/feeds/1931926814157454370/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sozorogusa.blogspot.com/2015/08/blog-post_20.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/1931926814157454370'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/1931926814157454370'/><link rel='alternate' type='text/html' href='http://sozorogusa.blogspot.com/2015/08/blog-post_20.html' title='プロジェクトオイラー　問１１４'/><author><name>こむ</name><uri>http://www.blogger.com/profile/10736571744712318490</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNK1CsSPbidvZx9DKomwWp5c-2EcaYiAbFeo71zuo6k9D6nei5VeJ6GLKitJkFh8GPRe-rO9JNyz15uVi_y6KtWiUaLV8F3XdViVvu_TibQcxIz7LPm2dwB2P8CRQWLDz-I-ugEGqSO0k/s72-c/p114_1.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5705819268459585346.post-2737737198170468631</id><published>2015-08-17T09:21:00.001+09:00</published><updated>2015-08-17T09:21:29.667+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python"/><title type='text'>プロジェクトオイラー　問１１３</title><content type='html'>&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;プロジェクトオイラー(Project Euler)の問題をpythonでやってみます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;日本語翻訳サイトは、プロジェクトオイラー日本語 でネット検索です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;問１１３「非はずみ数」&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;ある数の桁を左から右へと順に見たとき, 任意の桁の数が自身の左にある桁の数以上であるとき, その数を増加数 (increasing number) と呼ぶ;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;例えば134468は増加数である.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;同様に, 任意の桁の数が自身の右にある桁の数以上であるとき, その数を減少数 (decreasing number) と呼ぶ; 例えば66420がそうである.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;増加数でも減少数でもない数を &quot;はずみ&quot;数 (&quot;bouncy&quot; number) と呼ぶ; 155349がそうである.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;nが大きくなるにつれ, n以下のはずみ数の割合は大きくなる. 例えば, 100万未満では, はずみ数でない数は12951個しかない. 同様に, 10&lt;sup&gt;10&lt;/sup&gt;未満では277032個しかない.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;googol数 (10&lt;sup&gt;100&lt;/sup&gt;) 未満ではずみ数でないものの数を答えよ.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;注意！！！&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;自力で解きたい人へ&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;以降の記述には解法に関するネタバレが含まれます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;私の回答例は以下の通りです。&lt;/span&gt;&lt;br /&gt;
&lt;pre class=&quot;brush:python;collapse:true&quot; title=&quot;問１１３&quot;&gt;
def g(n):
&amp;#9;if n&amp;lt;2: return 1
&amp;#9;else: return n*g(n-1)

def C(n, m): return g(n)//g(m)//g(n-m)

def H(n, m): return C(n+m-1, m)

def f(n):
&amp;#9;c = H(10, n)-H(10, 0)
&amp;#9;for i in xrange(1, n+1): c += H(10,i)
&amp;#9;c -= 10*n
&amp;#9;return c

n=100
s = f(n)
print s
&lt;/pre&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;与えられた数が大きすぎるので桁数ごとに個数を計算して合計することにします。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;まず増加数です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;これは0から9までの数字10種類からi個を選ぶ重複組合せです。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;重複組合せの個数は公式から以下の通りです。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　&lt;sub&gt;10&lt;/sub&gt;H&lt;sub&gt;i&lt;/sub&gt; &amp;nbsp;...(A)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;図にすると、i桁の数字が以下のように表せます。「｜」は仕切り棒です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;連続する0｜連続する1|・・・｜連続する9&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;つまり、i個の要素を連続する0から連続する9までの10個の部分に分けることと同じです。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;重複組合せでは、仕切り棒の本数も含めた格納場所に仕切り棒を入れることを考えます&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;10個の部分に分けるので必要な仕切り棒は10-1で9本必要です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;つまり、i+9個の格納場所に9本の仕切り棒を格納し、仕切り棒の間には連続する数字を格納することと同じです。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;なお仕切り棒が隣合う場合、その間の連続する数字は１つも無いことになります。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;重複組合せの個数の式と、重複を許さない組合せの個数の式との関係は以下の通りです。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　&lt;sub&gt;n&lt;/sub&gt;H&lt;sub&gt;m&lt;/sub&gt; = &lt;sub&gt;n+m-1&lt;/sub&gt;C&lt;sub&gt;m&lt;/sub&gt; &amp;nbsp;...(B)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;m-1は、仕切り棒の本数です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;それから、最上位が0の場合、桁数がiではなくなってしまいますが、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;その個数は最上位1桁だけ0固定で他のi-1桁分は重複組合せなので、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　&lt;sub&gt;10&lt;/sub&gt;H&lt;sub&gt;i&lt;/sub&gt;-1&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;この分を差し引くと&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　&lt;sub&gt;10&lt;/sub&gt;H&lt;sub&gt;i&lt;/sub&gt; - &lt;sub&gt;10&lt;/sub&gt;H&lt;sub&gt;i-1&lt;/sub&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;これを全桁分、つまり桁数iを1からnまで動かして和をとると、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;ほとんどの項が打ち消しあって以下だけが残ります。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　&lt;sub&gt;10&lt;/sub&gt;H&lt;sub&gt;n&lt;/sub&gt; - &lt;sub&gt;10&lt;/sub&gt;H&lt;sub&gt;0&lt;/sub&gt; &amp;nbsp;...(C)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;次に減少数です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;減少数と同じように図にすると、i桁の数字が以下のように表せます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;連続する9｜連続する8|・・・｜連続する0&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;この重複組合せの個数は上記(A)と同じです。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;さらに、増加数と減少数で重複して数えている分を差し引きます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;増加数でも減少数でもカウントしている値は、全桁同じ数字の場合なので、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;各桁数ごとに10個あり、n桁以下の範囲では、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;10*n &amp;nbsp;...(D)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;１．g(n)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・階乗n!を返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・&lt;a href=&quot;http://sozorogusa.blogspot.jp/2012/06/problem20.html&quot;&gt;問２０&lt;/a&gt;のものを流用しました。&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;２．関数C(n, m)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・n個の中からm個を選ぶ組合せの個数を返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・公式から、n!/（m!・(n-m)!）　です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;３．関数H(n, m)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・n個の中からm個を選ぶ重複組合せの個数を返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・上記(B)をそのまま実装しました。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;４．関数f(n)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・10&lt;sup&gt;n&lt;/sup&gt;未満、つまりn桁以下で、はずみ数以外の数の個数を返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・c = H(10, n)-H(10, 0)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　増加数の個数です。上記(C)をそのまま実装しました。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・for i in xrange(1, n+1): c += H(10,i)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　減少数の個数です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　n桁の減少数である上記(A)をそのまま実装し、1桁からn桁の分の和を計算しました。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・c -= 10*n&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　増加数と減少数の重複分を差し引きます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　上記(D)をそのまま実装しました。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;解答はこのすぐ下の行です。文字の色を白にしてます。選択状態にすると見えます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: white; font-family: Courier New, Courier, monospace;&quot;&gt;51161058134250&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sozorogusa.blogspot.com/feeds/2737737198170468631/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sozorogusa.blogspot.com/2015/08/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/2737737198170468631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/2737737198170468631'/><link rel='alternate' type='text/html' href='http://sozorogusa.blogspot.com/2015/08/blog-post.html' title='プロジェクトオイラー　問１１３'/><author><name>こむ</name><uri>http://www.blogger.com/profile/10736571744712318490</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5705819268459585346.post-3506405382279958419</id><published>2015-07-05T14:40:00.000+09:00</published><updated>2015-07-05T14:40:52.030+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python"/><title type='text'>プロジェクトオイラー　問１１２</title><content type='html'>&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;プロジェクトオイラー(Project Euler)の問題をpythonでやってみます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;日本語翻訳サイトは、プロジェクトオイラー日本語 でネット検索です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;問１１２「はずみ数」&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;左から右までどの桁もその左の桁を下回らない数を増加数と呼ぶ. 例えば, 134468.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;同様に, どの桁もその右の桁を下回らない数を減少数と呼ぶ. 例えば, 66420.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;増加数でも減少数でもない正の整数をはずみ数と呼ぶことにする. 例えば, 155349.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;100以下にはずみ数が無いのは明らかだが, 1000未満では半数を少し上回る525個がはずみ数である.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;実際, はずみ数の割合が50%に達する最少の数は538である.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;驚くべきことに, はずみ数はますます一般的になり, 21780でははずみ数の割合は90%に達する.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;はずみ数の割合がちょうど99%になる最小の数を求めよ.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;注意！！！&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;自力で解きたい人へ&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;以降の記述には解法に関するネタバレが含まれます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;私の回答例は以下の通りです。&lt;/span&gt;&lt;br /&gt;
&lt;pre class=&quot;brush:python;collapse:true&quot; title=&quot;問１１２&quot;&gt;
def f(n):
&amp;#9;i, b, c, r = 0, 0.0, 0.0, n/100.0
&amp;#9;while True:
&amp;#9;&amp;#9;i += 1
&amp;#9;&amp;#9;s = str(i)
&amp;#9;&amp;#9;t = &quot;&quot;.join([j for j in sorted(s)])
&amp;#9;&amp;#9;u = &quot;&quot;.join([j for j in sorted(s, reverse=True)])
&amp;#9;&amp;#9;if t&amp;lt;s&amp;lt;u: b += 1
&amp;#9;&amp;#9;else: c += 1
&amp;#9;&amp;#9;if r&amp;lt;=b/(b+c): break

&amp;#9;return i

n=99
s = f(n)
print s
&lt;/pre&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;小さい数から順に各桁を昇順降順にソートした値と比較することではずみ数か判定し、&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;件数カウントしその割合を計算しました。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;１．関数f(n)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・はずみ数の割合がちょうどn％になる最小の数を返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・変数iは候補値、変数bははずみ数の個数、変数cははずみ数以外の個数、変数rは割合です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・変数sで候補値を文字列にします。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; ループ変数jでひと桁ずつ取り出し、sorted関数で昇順にして再度連結した値を変数tとし、&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;sorted関数のreverse引数をTrueにすることで降順にして再度連結した値を変数uとします。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・変数tとuはそれぞれ増加数と減少数なので、変数sがこれらの間の値であれば、はずみ数と判定します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;解答はこのすぐ下の行です。文字の色を白にしてます。選択状態にすると見えます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: white; font-family: Courier New, Courier, monospace;&quot;&gt;1587000&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://sozorogusa.blogspot.com/feeds/3506405382279958419/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sozorogusa.blogspot.com/2015/07/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/3506405382279958419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/3506405382279958419'/><link rel='alternate' type='text/html' href='http://sozorogusa.blogspot.com/2015/07/blog-post.html' title='プロジェクトオイラー　問１１２'/><author><name>こむ</name><uri>http://www.blogger.com/profile/10736571744712318490</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5705819268459585346.post-1990718422171806478</id><published>2015-06-21T15:54:00.000+09:00</published><updated>2015-06-21T15:54:08.571+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python"/><title type='text'>プロジェクトオイラー　問１１１</title><content type='html'>&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;プロジェクトオイラー(Project Euler)の問題をpythonでやってみます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;日本語翻訳サイトは、プロジェクトオイラー日本語 でネット検索です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;問１１１「重複桁を持つ素数」&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;重複した桁を含む 4 桁の素数を考える.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;全てが同じにならないのは明らかである:&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;1111 は 11 で割り切れ, 2222 は 22 で割り切れ, 以下同様だからである.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;しかし 3 個の 1 を含む 4 桁の素数は 9 つある:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;1117, 1151, 1171, 1181, 1511, 1811, 2111, 4111, 8111&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;n 桁の素数に対する重複した桁の最大個数を M(n, d) と表すことにしよう.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;ここで d は重複した桁とする.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;またそのような素数の個数を N(n, d) と表し, これらの素数の和を S(n, d) と表す.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;よって M(4, 1) = 3 は, 重複した桁を 1 としたときの,&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;4 桁の素数に対する重複した桁の最大個数である.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;そのような素数は N(4, 1) = 9 個あり, これらの素数の和は S(4, 1) = 22275 である.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;d = 0 に対しては, 重複した桁は M(4, 0) = 2 個だけ可能であることが分かるが,そのような場合は N(4, 0) = 13 個ある.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;同じようにして 4 桁の素数に対して次の結果を得る.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;div style=&#39;text-align:center;&#39;&gt;
&lt;table align=&#39;center&#39; border=&#39;1&#39; cellspacing=&#39;0&#39; cellpadding=&#39;5&#39;&gt;
&lt;tr&gt;
&lt;td&gt;Digit, d&lt;/td&gt;
&lt;td&gt;M(4, d)&lt;/td&gt;
&lt;td&gt;N(4, d)&lt;/td&gt;
&lt;td&gt;S(4, d)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;67061&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;22275&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2221&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;46214&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;8888&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;5557&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;6661&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;57863&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;8887&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;48073&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;d = 0 から 9 に対して, S(4, d) の総和は 273700 である.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;S(10, d) の総和を求めよ.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;注意！！！&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;自力で解きたい人へ&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;以降の記述には解法に関するネタバレが含まれます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;私の回答例は以下の通りです。&lt;/span&gt;&lt;br /&gt;
&lt;pre class=&quot;brush:python;collapse:true&quot; title=&quot;問１１１&quot;&gt;
def h(n):
&amp;#9;import itertools
&amp;#9;if n==2: return True
&amp;#9;if n&amp;lt;2 or (not n%2): return 0
&amp;#9;for i in itertools.islice(itertools.count(3, 2), None):
&amp;#9;&amp;#9;if i*i&amp;gt;n: break
&amp;#9;&amp;#9;if not n%i: return 0
&amp;#9;return n

def g(M, w):
&amp;#9;L = []
&amp;#9;for s in M:
&amp;#9;&amp;#9;if s[0]==&quot;0&quot;:
&amp;#9;&amp;#9;&amp;#9;for t in w:
&amp;#9;&amp;#9;&amp;#9;&amp;#9;L.append(t+s)
&amp;#9;&amp;#9;else:
&amp;#9;&amp;#9;&amp;#9;for i in xrange(len(s)+1):
&amp;#9;&amp;#9;&amp;#9;&amp;#9;for t in w:
&amp;#9;&amp;#9;&amp;#9;&amp;#9;&amp;#9;if i==0 and t==&quot;0&quot;: continue
&amp;#9;&amp;#9;&amp;#9;&amp;#9;&amp;#9;L.append(s[:i]+t+s[i:])
&amp;#9;&amp;#9;&amp;#9;&amp;#9;
&amp;#9;return L

def f(n):
&amp;#9;SS = 0
&amp;#9;for d in xrange(10):
&amp;#9;&amp;#9;w = [str(i) for i in xrange(10) if i!=d]
&amp;#9;&amp;#9;S, M = 0, n
&amp;#9;&amp;#9;while S==0:
&amp;#9;&amp;#9;&amp;#9;M -= 1
&amp;#9;&amp;#9;&amp;#9;L = [str(d)*M]
&amp;#9;&amp;#9;&amp;#9;for i in xrange(n-M): L = g(L, w)
&amp;#9;&amp;#9;&amp;#9;L = set(L)
&amp;#9;&amp;#9;&amp;#9;for t in L: S += h(int(&quot;&quot;.join(t)))
&amp;#9;&amp;#9;&amp;#9;
&amp;#9;&amp;#9;SS += S
&amp;#9;&amp;#9;
&amp;#9;return SS

n=10
s = f(n)
print s
&lt;/pre&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;素数を発生させて重複桁があるかチェックする方式でやってみたところ、チェック以前に10桁分の素数の発生がとても1分で終わらないことが判明しました。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;  そこで、やり方を逆にして、まず重複桁の値を決め、&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;その他の値を重複桁の間や両側に付加して候補値を作り、素数チェックをするようにしました。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;１．関数h(n)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・素数ならｎ、素数以外なら0を返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・&lt;a href=&quot;http://sozorogusa.blogspot.jp/2012/09/project-euler-problem-58.html&quot;&gt;問５８&lt;/a&gt;の 素数判定関数を改良しました。&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・forループではxrange関数で数値を発生させていましたが、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; 10桁の整数の途中からオーバーフローになるので&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; itertoolsモジュールのislice関数を使うように改良しました。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;２．関数g(M, w)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・リストMの全要素の両端や文字間に、リストwから取り出した１文字を付加した値を作り&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;リストにまとめて返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; 但し、後で数値化したときに桁数が減ってしまうことを避けるために、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; リストMの各要素の先頭が0の場合は左端にだけ付加し、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; 付加する文字が0の場合は左端以外にだけ付加します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;３．関数f(n)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・n桁の素数について問題文のSの合計を返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・ループ変数dは重複する桁の値で、0から9の値をとります。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・リストwは重複しない桁の値で、0から9のうち、dと異なる値を持ちます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・変数Sは、dが重複するn桁の素数の和です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・変数Mは、重複する桁dの個数です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・while文では変数Mを１つずつ減らしながらSを計算し0以外になれば終了します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・変数iは、全体n桁のうちd以外の値の個数です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・リストLは、関数gでd以外の値をi個付加した候補値のリストです。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; リストLの要素を１つずつ取り出し、連結して数値化し、関数hで素数判定します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; 素数ならば、変数Sに累積していきます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・whileループを抜けたら、SをSSに累積して、次のdでの処理に続きます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;解答はこのすぐ下の行です。文字の色を白にしてます。選択状態にすると見えます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: white; font-family: Courier New, Courier, monospace;&quot;&gt;612407567715&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://sozorogusa.blogspot.com/feeds/1990718422171806478/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sozorogusa.blogspot.com/2015/06/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/1990718422171806478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/1990718422171806478'/><link rel='alternate' type='text/html' href='http://sozorogusa.blogspot.com/2015/06/blog-post.html' title='プロジェクトオイラー　問１１１'/><author><name>こむ</name><uri>http://www.blogger.com/profile/10736571744712318490</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5705819268459585346.post-1600782462996901803</id><published>2015-05-23T14:12:00.000+09:00</published><updated>2015-06-21T15:48:58.623+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python"/><title type='text'>プロジェクトオイラー　問１１０</title><content type='html'>&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;プロジェクトオイラー(Project Euler)の問題をpythonでやってみます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;日本語翻訳サイトは、プロジェクトオイラー日本語 でネット検索です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;問１１０「ディオファントス逆数 その2」&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;次の等式で x, y, n は正の整数である.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;1/x + 1/y = 1/n&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;n = 1260 では 113 の異なる解があり, この n が解の個数が 100 を超える最小の値である.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;解の数が 4,000,000 を超える最小の n を求めよ.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;注: この問題は Problem 108 を非常に難しくしたケースである. 総当り法で解ける範囲を超えているので, 賢い解き方が求められる.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;注意！！！&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;自力で解きたい人へ&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;以降の記述には解法に関するネタバレが含まれます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;私の回答例は以下の通りです。&lt;/span&gt;&lt;br /&gt;
&lt;pre class=&quot;brush:python;collapse:true&quot; title=&quot;問１１０&quot;&gt;
def P(n):
&amp;#9;L, i = [], 1
&amp;#9;if n&amp;gt;0:
&amp;#9;&amp;#9;L.append(2)
&amp;#9;&amp;#9;while len(L)&amp;lt;n:
&amp;#9;&amp;#9;&amp;#9;i += 2
&amp;#9;&amp;#9;&amp;#9;for j in L:
&amp;#9;&amp;#9;&amp;#9;&amp;#9;if not i%j: break
&amp;#9;&amp;#9;&amp;#9;else:
&amp;#9;&amp;#9;&amp;#9;&amp;#9;L.append(i)
&amp;#9;return L

def mul(L): return reduce(lambda x,y:x*y, L)

def f(m):
&amp;#9;import math
&amp;#9;tmax = int(math.log(m*2, 3))
&amp;#9;p = P(tmax+1)
&amp;#9;nb, kb, Lb, L = 0, 0, [], []
&amp;#9;while len(L)&amp;lt;=tmax:
&amp;#9;&amp;#9;L = [1]*(len(L)+1)
&amp;#9;&amp;#9;M = [i*2+1 for i in L]
&amp;#9;&amp;#9;k = (mul(M)+1)//2
&amp;#9;&amp;#9;while k&amp;lt;=m:
&amp;#9;&amp;#9;&amp;#9;for i in xrange(len(L)):
&amp;#9;&amp;#9;&amp;#9;&amp;#9;if tmax&amp;lt;=1 or (i&amp;lt;len(L)-1 and L[i]==L[i+1]):
&amp;#9;&amp;#9;&amp;#9;&amp;#9;&amp;#9;L[i] += 1
&amp;#9;&amp;#9;&amp;#9;&amp;#9;&amp;#9;for j in xrange(i):
&amp;#9;&amp;#9;&amp;#9;&amp;#9;&amp;#9;&amp;#9;if L[j]&amp;gt;L[i]: L[j] = L[i]
&amp;#9;&amp;#9;&amp;#9;&amp;#9;&amp;#9;break
&amp;#9;&amp;#9;&amp;#9;else:
&amp;#9;&amp;#9;&amp;#9;&amp;#9;L = [1]*(len(L)+1)

&amp;#9;&amp;#9;&amp;#9;M = [i*2+1 for i in L]
&amp;#9;&amp;#9;&amp;#9;k = (mul(M)+1)//2

&amp;#9;&amp;#9;N = [p[i]**j for i,j in enumerate(L)]
&amp;#9;&amp;#9;n = mul(N)
&amp;#9;&amp;#9;if nb==0 or n&amp;lt;=nb: nb, kb, Lb = n, k, L
&amp;#9;return nb, kb, Lb

m=4000000
n, k, L = f(m)
print &quot;n :&quot;, n
print &quot;k :&quot;, k
print &quot;L :&quot;, L
&lt;/pre&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;問１０８ではnを１つずつ増やしながら解の個数kを求めてkが閾値を超えたら終了という&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;ロジックで解きましたが、解の個数kが巨大な数になると、&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;素因数分解の処理が重くて処理が終わりません。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;まず、問１０８からわかっていることは以下のとおりです。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・解の個数kは、n&lt;sup&gt;2&lt;/sup&gt;を２つの約数の積で表したパターンの個数に等しい。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・n&lt;sup&gt;2&lt;/sup&gt;の約数の個数iについて、&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;n&lt;sup&gt;2&lt;/sup&gt;を素因数分解した結果に含まれる各素因数に対して、&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;採用0個の場合も含めたパターン数は各要素数+1であり、&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;これを全素因数の分だけ掛け合わせた積が、約数の個数iということになります。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　例：72の約数の個数は、72=2&lt;sup&gt;3&lt;/sup&gt;＋3&lt;sup&gt;2&lt;/sup&gt;, べき乗の値から、(3+1)x(2+1)=12&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・n&lt;sup&gt;2&lt;/sup&gt;の約数の個数iとして、２つの約数の積でn&lt;sup&gt;2&lt;/sup&gt;になる組合せの個数kとして、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;　k = (i+1)//2 &amp;nbsp;（小数以下切捨て）です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;上記からnと解の個数kの関係を、&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;例にあるn=1260, k=113の場合を手で計算してみると以下の通りです。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;n = 1260&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;↑積　　↓因数分解&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;素数とべきリスト値の累乗リストN = [2&lt;sup&gt;2&lt;/sup&gt;, 3&lt;sup&gt;2&lt;/sup&gt;, 5&lt;sup&gt;1&lt;/sup&gt;, 7&lt;sup&gt;1&lt;/sup&gt;] = [4, 9, 5, 7]&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;↑小さい順の素数にべきリストLの値で累乗&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;べきリストL = [2, 2, 1, 1]&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;↓各要素の２乗&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;べき２乗リスト = [4, 4, 2, 2]&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;↓各要素に+1する&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;約数の個数リストM = [5, 5, 3, 3]&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;↓各要素の積&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;約数の個数 = 5*5*3*3 = 225&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;↓&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;解の個数k = (225+1)//2 = 113&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;問108ではnから出発して１つずつ因数分解をしていましたが、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;一見して明らかに一番取り扱い易そうなのは、上記のべきリストLです。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;べきリストLを調整しつつ、kを算出してしきい値判定して、nを特定する方法でいきます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;しきい値mとして、m&amp;lt;kである最小のnを求めるので、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;m&amp;lt;kを満たすkが特定されたときにnが最小であるためには、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;べきリストLは、左の要素≧右の要素 ...(a)&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;べきリストLの要素数をtに固定すると、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;nが最小になるのは、全要素が1のとき。例　[1,1, ... ,1]　1がt個ある。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;べきリストLの要素数tの最大値tmaxは、全要素が1でm=kのときのtの値です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;このとき約数の個数リストMは1*2+1=3だけがtmax個ある状態で、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;解の個数k = (3&lt;sup&gt;tmax&lt;/sup&gt;)//2 = m（しきい値）となります。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;3&lt;sup&gt;tmax&lt;/sup&gt; = m*2&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;両辺の対数をとって、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;tmax * log3 =log(m*2)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;tmax = log(m*2)/log3 = log&lt;sub&gt;3&lt;/sub&gt;(m*2) （小数以下切捨て）...(b)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;１．関数P(n)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・小さい方からn個の素数リストを返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・&lt;a href=&quot;http://sozorogusa.blogspot.jp/2015/04/blog-post.html&quot;&gt;Problem108&lt;/a&gt;で作成した関数を流用します。詳しくは&lt;a href=&quot;http://sozorogusa.blogspot.jp/2015/04/blog-post.html&quot;&gt;Problem108&lt;/a&gt;を参照。&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;２．関数mul(L)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・リストLの全要素の積を返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・reduce文で、第１引数の関数f、第２引数にリストLを設定しています。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・関数fは「lambda x,y:x*y」です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　無名関数lambdaを使って、引数１と引数２の積を計算します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・reduce文では関数fの第２引数にリストLの要素を順に渡し、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　関数fの第１引数に関数処理結果を設定します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　このため、関数fでfの第１引数と第２引数を元に計算することで、&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;累積的な処理が記述できます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　reduce文は、累積的は処理を短く記述できますが、少しややこしい構文です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;３．関数f(m)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・1/x + 1/y = 1/n（x,y,nは正の整数）となる解の個数kが引数mを超える最小値を求め、&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;n、k、べきリストLを返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・べきリストLの要素数の最大値tmaxは、上記(b)をそのまま実装します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・素数リストpは、関数Pでtmax個の素数を準備します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・外側のwhileループでは、べきリストの要素数がtmax以下の場合にべきリストを調整して解の候補を探します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・べきリストLの初期値は全要素1で要素数をループの都度１つずつ増やします。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・内側のwhileループでは、解の個数kがそのしきい値m以下の場合にべきリストを調整して解の候補を探します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・現在のべきリストに基づいて次のべきリストを調整します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・iのforループで、べきリストの要素を右から順に見ていきます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　まず、べきリストの最大要素数が1以下、または「右隣と同じ値」である最初の要素を+1します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　例：[1] → [2]&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　例：[4, 3, 2, 2, 1, 1] → [4, 3, 3, 2, 1, 1]&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　さらに、+1した要素の左側は、L[i]にクリアします。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　例：[4, 3, 3, 2, 1, 1] → [3, 3, 3, 2, 1, 1]&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　-1する前のリストは当ループが進めばまた出てきます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・forループが最後まで終了したら、&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;べきリストLの要素数を１つ増やして全要素1にクリアします。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　for文のelse句は、for文のループがbreakで途中で抜けずに&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;最後まで終了した直後に実行する処理を記述します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　例：[3, 2, 1] → [1, 1, 1, 1]&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・このようにしてべきリストLを作成したら、チェックします。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　約数の個数リストM、解の個数kを計算します。&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;   &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・解の個数kがしきい値を超えて内側のwhileループが終了したら、&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;素数とべきリスト値の累乗リストN、そして求める値nを計算し、&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;バックアップしてある値と比較して、最小のnの場合にバックアップするようにします。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;解答はこのすぐ下の行です。文字の色を白にしてます。選択状態にすると見えます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: white; font-family: Courier New, Courier, monospace;&quot;&gt;n : 9350130049860600&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: white; font-family: Courier New, Courier, monospace;&quot;&gt;k : 4018613&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: white; font-family: Courier New, Courier, monospace;&quot;&gt;L : [3, 3, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1]&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://sozorogusa.blogspot.com/feeds/1600782462996901803/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sozorogusa.blogspot.com/2015/05/blog-post_23.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/1600782462996901803'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/1600782462996901803'/><link rel='alternate' type='text/html' href='http://sozorogusa.blogspot.com/2015/05/blog-post_23.html' title='プロジェクトオイラー　問１１０'/><author><name>こむ</name><uri>http://www.blogger.com/profile/10736571744712318490</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5705819268459585346.post-4993653235298049179</id><published>2015-05-03T17:14:00.000+09:00</published><updated>2015-05-03T17:14:25.236+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python"/><title type='text'>プロジェクトオイラー　問１０９</title><content type='html'>&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;プロジェクトオイラー(Project Euler)の問題をpythonでやってみます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;日本語翻訳サイトは、プロジェクトオイラー日本語 でネット検索です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;問１０９「ダーツ」&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;ダーツゲームでは, プレイヤーは 20 等分に分けられたダーツボードに 3 本のダーツを投げる.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;ダーツボードは 1 から 20 の番号がふられている.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgBP4ZXysPgDpl2L7iwTbCWEnG90R8SH_u1v48RLLPKnO_8kduaTs1KDtNPrnwgCxebiYkMJvFE-MCKnMvfXba-Ft_BXF6CY09GjtcRhqb9D4xniMjz48NoytQPgYx8cZXLG_IlWTksnA/s1600/p109.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgBP4ZXysPgDpl2L7iwTbCWEnG90R8SH_u1v48RLLPKnO_8kduaTs1KDtNPrnwgCxebiYkMJvFE-MCKnMvfXba-Ft_BXF6CY09GjtcRhqb9D4xniMjz48NoytQPgYx8cZXLG_IlWTksnA/s1600/p109.gif&quot; height=&quot;320&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;ダーツの点数は, ダーツが刺さった領域の番号によって決まる.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;外側の赤緑の輪の外に刺さったダーツは 0 点である.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;この輪の内側の黒と白の領域はシングル (1 倍) の点数を表している.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;しかし, 外側と内側の赤緑の輪はそれぞれダブル (2 倍) とトリプル (3 倍) の点数である.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;ボードの中央の 2 つの同心円はブルやブルズアイと呼ばれる.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;外側のブルは 25 点, 内側のブルはダブルの 50 点である.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;ルールには多くのバリエーションがあるが, 最もポピュラーなゲームでは,&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;プレイヤーは 301 または 501 点から始まり, 最も早く現在の得点を 0 点に減らしたプレイヤーが勝者となる.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;しかし, 普通は「ダブルアウト」方式でプレイをする.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;この方式では, プレイヤーは勝利するために,&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;最後のダーツをダブル (ボードの中央のダブルのブルズアイを含む) に刺さなければならない.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;それ以外で現在の得点を 1 点以下に減らした場合,&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;3 本のダーツに対する得点は「バースト(無効)」になる.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;プレイヤーが現在の得点で終了できる場合を「チェックアウト」と呼ぶ.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;最も高いチェックアウトは 170: T20 T20 D25 (トリプルの 20 を 2 回とダブルのブル) である.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;得点が 6 でチェックアウトする異なるやり方はちょうど 11 通りある.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;D3 &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;D1 D2 &amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;S2 D2 &amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;D2 D1 &amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;S4 D1 &amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;S1 S1 D2&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;S1 T1 D1&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;S1 S3 D1&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;D1 D1 D1&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;D1 S2 D1&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;S2 S2 D1&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;D1 D2 と D2 D1 は, 異なるダブルで終了しているので異なるとみなすことに注意しよう.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;しかし S1 T1 D1 の組み合わせは T1 S1 D1 と同じとみなす.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;さらに, 組み合わせを考える上でミスは含まないこととする;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;たとえば, D3 は 0 D3 や 0 0 D3 と同じである.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;信じられないことに, 異なるチェックアウトは全部で 42336 通りある.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;得点が 100 未満の異なるチェックアウトは何通りあるか.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;注意！！！&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;自力で解きたい人へ&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;以降の記述には解法に関するネタバレが含まれます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;私の回答例は以下の通りです。&lt;/span&gt;&lt;br /&gt;
&lt;pre class=&quot;brush:python;collapse:true&quot; title=&quot;問１０９&quot;&gt;
def f(n):
&amp;#9;Ls = [i+1 for i in xrange(20)]+[25]
&amp;#9;Ld = [(i+1)*2 for i in xrange(20)]+[50]
&amp;#9;Lt = [(i+1)*3 for i in xrange(20)]
&amp;#9;La = Ls+Ld+Lt
&amp;#9;c = 0

&amp;#9;for i in Ld:
&amp;#9;&amp;#9;if i&amp;lt;n: c += 1

&amp;#9;for i in La:
&amp;#9;&amp;#9;for j in Ld:
&amp;#9;&amp;#9;&amp;#9;if i+j&amp;lt;n: c += 1

&amp;#9;for m, i in enumerate(La):
&amp;#9;&amp;#9;for j in La[m:]:
&amp;#9;&amp;#9;&amp;#9;for k in Ld:
&amp;#9;&amp;#9;&amp;#9;&amp;#9;if i+j+k&amp;lt;n: c += 1

&amp;#9;return c

n=100
c = f(n)
print c
&lt;/pre&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;何投目で終了するかの別に分けてカウントします。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;１．関数f(n)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・n点未満でチェックアウトするときの、場合の数を返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・リストLsはシングルの得点リストです。要素は1から20までの整数と25です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・リストLdはダブルの得点リストです。要素は1から20までの偶数と50です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・リストLtはトリプルの得点リストです。要素は1から20までの3の倍数です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・リストLaは全面の得点リストです。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　シングル、ダブル、トリプルのリストを単純に結合したものです。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・１投終了の場合、ダブルのリストLdです。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　この中から得点合計がn未満の場合をカウントします。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・２投終了の場合、１投目は前面リストLa、２投目はダブルのリストLdです。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　二重ループで状況を再現し、得点合計がn未満の場合をカウントします。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・３投終了の場合、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　１投目は前面リストLa、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　２投目は前面リストLaのうち１投目としてカウントしてないもの、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　つまり、リストLaから１投目で採用した位置よりも後の位置で採用します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　３投目はダブルのリストLdです。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　三重ループで状況を再現し、得点合計がn未満の場合をカウントします。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;解答はこのすぐ下の行です。文字の色を白にしてます。選択状態にすると見えます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: white; font-family: Courier New, Courier, monospace;&quot;&gt;38182&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://sozorogusa.blogspot.com/feeds/4993653235298049179/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sozorogusa.blogspot.com/2015/05/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/4993653235298049179'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/4993653235298049179'/><link rel='alternate' type='text/html' href='http://sozorogusa.blogspot.com/2015/05/blog-post.html' title='プロジェクトオイラー　問１０９'/><author><name>こむ</name><uri>http://www.blogger.com/profile/10736571744712318490</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgBP4ZXysPgDpl2L7iwTbCWEnG90R8SH_u1v48RLLPKnO_8kduaTs1KDtNPrnwgCxebiYkMJvFE-MCKnMvfXba-Ft_BXF6CY09GjtcRhqb9D4xniMjz48NoytQPgYx8cZXLG_IlWTksnA/s72-c/p109.gif" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5705819268459585346.post-4312562973697831933</id><published>2015-04-04T18:55:00.000+09:00</published><updated>2015-04-04T18:55:14.045+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python"/><title type='text'>プロジェクトオイラー　問１０８</title><content type='html'>&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;プロジェクトオイラー(Project Euler)の問題をpythonでやってみます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;日本語翻訳サイトは、プロジェクトオイラー日本語 でネット検索です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;問１０８「ディオファントス逆数 その1」&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;次の等式で x, y, n は正の整数である.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;1/x + 1/y = 1/n&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;n = 4 では 3 つの異なる解がある.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;1/5 + 1/20 = 1/4&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;1/6 + 1/12 = 1/4&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;1/8 + 1/8 = 1/4&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;解の数が 1000 を超える最小の n を求めよ.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;注: この問題は Problem 110 の易しいケースである. こちらを先に解く事を強く勧める.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;注意！！！&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;自力で解きたい人へ&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;以降の記述には解法に関するネタバレが含まれます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;私の回答例は以下の通りです。&lt;/span&gt;&lt;br /&gt;
&lt;pre class=&quot;brush:python;collapse:true&quot; title=&quot;問１０８&quot;&gt;
def P(n):
&amp;#9;L, i = [], 1
&amp;#9;if n&amp;gt;0:
&amp;#9;&amp;#9;L.append(2)
&amp;#9;&amp;#9;while len(L)&amp;lt;n:
&amp;#9;&amp;#9;&amp;#9;i += 2
&amp;#9;&amp;#9;&amp;#9;for j in L:
&amp;#9;&amp;#9;&amp;#9;&amp;#9;if not i%j: break
&amp;#9;&amp;#9;&amp;#9;else:
&amp;#9;&amp;#9;&amp;#9;&amp;#9;L.append(i)
&amp;#9;return L

def g(n, P):
&amp;#9;s, d = n, {}
&amp;#9;for i in P:
&amp;#9;&amp;#9;while s&amp;gt;=i:
&amp;#9;&amp;#9;&amp;#9;if s%i: break
&amp;#9;&amp;#9;&amp;#9;else:
&amp;#9;&amp;#9;&amp;#9;&amp;#9;while not s%i:
&amp;#9;&amp;#9;&amp;#9;&amp;#9;&amp;#9;d[i], s = d.get(i, 0)+1, s//i
&amp;#9;&amp;#9;if s&amp;lt;i: break
&amp;#9;return d&amp;nbsp;

def f(m):
&amp;#9;import math
&amp;#9;i = int(math.log(2*m-1, 2))
&amp;#9;n, k, p = 1, 1, P(i)
&amp;#9;while k&amp;lt;=m:
&amp;#9;&amp;#9;n += 1
&amp;#9;&amp;#9;d = g(n*n, p)
&amp;#9;&amp;#9;i = 1
&amp;#9;&amp;#9;for j in d.values(): i *= j+1
&amp;#9;&amp;#9;k = (i+1)//2
&amp;#9;return n, k

m=1000
n, k = f(m)
print &quot;n :&quot;, n
print &quot;k :&quot;, k
&lt;/pre&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;問題の式を変形してみます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;1/x + 1/y = 1/n&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;両辺にnxyを掛けて&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;ny &amp;nbsp;+ nx &amp;nbsp;= xy&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;xy - nx - ny = 0 ...a&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;式aを２つの数の積で表して差分調整することにします。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;xy, nx, nyを展開式の項として持つ式で最も簡単な式は以下の通り。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;(x-n)(y-n) = xy - nx - ny + n&lt;sup&gt;2&lt;/sup&gt; ...b&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;式bに式aを代入して、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;(x-n)(y-n) = n&lt;sup&gt;2&lt;/sup&gt; ...c&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;n&lt;sup&gt;2&lt;/sup&gt;を２つの正の整数の積で表し、それぞれ+nすればxとyになります。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;つまり、当問題でチェックすべき「解の数」は、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;n&lt;sup&gt;2&lt;/sup&gt;を２つの約数の積で表したパターンの個数です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;また、２つの約数の積が元の数になる組合せは、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;約数を順に並べて小さい方からと大きい方からそれぞれ１つずつ採用し、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;中央値がある場合は中央値を２つ採用した組合せです。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;なので、n&lt;sup&gt;2&lt;/sup&gt;の約数の個数i、該当する約数の組合せの個数kとして、以下の通りです。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;k = (i+1)/2 &amp;nbsp;（小数点以下切捨て）...d&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;また、約数の個数iは素因数分解した素因数ごとの採用パターン数の積です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;n&lt;sup&gt;2&lt;/sup&gt;を素因数分解した結果の素因数ごとの要素数jとして、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;その採用0個の場合も含めたパターン数j+1について、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;全ての素因数の分の積を計算します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;この約数の個数iから、約数ペアの個数kを求め、指定値mを超えるまで処理を繰り返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;また、素因数分解にあたり素数をいくつまで用意したらいいか検討します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;素因数分解で使用する素数の個数の上限値tについて、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;この分だけ最小素数2を累乗しても約数の個数i以上となるので、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;2&lt;sup&gt;t&lt;/sup&gt; ≧ i&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;両辺の対数を取って、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;tlog2 ≧ log(i)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;t ≧ log(i)/log2 = log&lt;sub&gt;2&lt;/sub&gt;i&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;式dを代入して、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;t ≧ log&lt;sub&gt;2&lt;/sub&gt;(2k-1)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;t = log&lt;sub&gt;2&lt;/sub&gt;(2k-1) （小数点以下切り捨て）...e&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;素因数分解の準備として、素因数分解で使用する素数の個数の上限値tの分だけ素数を用意しておきます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;１．関数P(n)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・小さい方からn個の素数リストを返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・リストLは素数リスト、変数iは素数候補です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・リストLに最初の素数2を設定します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・3以上の奇数を素数候補として、リストLにある素数で順に割り算します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　割り算の余りが無い時点で素数候補iは素数ではないので、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　forループをbreakして次の素数候補へ処理がすすみ、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　リストLのすべての素数で割り算の余りがあれば、forループが最後まで回るのでelse句へ進んで素数リストLに素数候補iを追加します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・上記を指定した素数の個数になるまで続けます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;２．関数g(n, P)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・&lt;a href=&quot;http://sozorogusa.blogspot.jp/2012/08/project-euler-probrem-47.html&quot;&gt;Problem47&lt;/a&gt;で作成した関数を流用します。詳しくは&lt;/span&gt;&lt;a href=&quot;http://sozorogusa.blogspot.jp/2012/08/project-euler-probrem-47.html&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;Problem47&lt;/a&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;を参照。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・引数nを素数リストPを使って素因数分解し、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　素数をキー、キーごとの分解した個数を値とする辞書（連想配列）を返します。&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;３．関数f(m)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・1/x + 1/y = 1/n（x,y,nは正の整数）となる解の個数kがmを超える最小値を求め、nとkを返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・対数関数を使う準備としてmathモジュールをインポートし式eを実装します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　math.log関数の引数は、真数、底の順に設定します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　変数nは問題文の右辺1/nのn、変数kはチェック対象の解の個数です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・whileループで、解の個数kが指定値mを超えるまで処理を繰り返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・変数dは関数gによるn&lt;sup&gt;2&lt;/sup&gt;に対して素数リストpを使用して因数分解した結果の辞書（連想配列）です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・ループ関数jで因数分解辞書dから、素因数の値に関係なく、素因数ごとの要素数を設定します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　変数iに、該当する素因数の個数j個に0個採用のケースも含めたj+1を掛けてためます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・変数kとして、式dを実装します。//関数は割り算の商（整数値）です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;解答はこのすぐ下の行です。文字の色を白にしてます。選択状態にすると見えます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: white; font-family: Courier New, Courier, monospace;&quot;&gt;n : 180180&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: white; font-family: Courier New, Courier, monospace;&quot;&gt;k : 1013&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://sozorogusa.blogspot.com/feeds/4312562973697831933/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sozorogusa.blogspot.com/2015/04/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/4312562973697831933'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/4312562973697831933'/><link rel='alternate' type='text/html' href='http://sozorogusa.blogspot.com/2015/04/blog-post.html' title='プロジェクトオイラー　問１０８'/><author><name>こむ</name><uri>http://www.blogger.com/profile/10736571744712318490</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5705819268459585346.post-1358979643790486597</id><published>2015-03-01T20:53:00.000+09:00</published><updated>2015-03-01T20:53:23.986+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python"/><title type='text'>プロジェクトオイラー　問１０７</title><content type='html'>&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;プロジェクトオイラー(Project Euler)の問題をpythonでやってみます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;日本語翻訳サイトは、プロジェクトオイラー日本語 でネット検索です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;問１０７「最短ネットワーク」&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;以下の無向ネットワークは7つの頂点と重み付きの12個の辺からなり, 重みの総和は243である.&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmLc5fpMEZS8xFaW4pj0n4ZPSImvk1-1lOq_Ec0LY4nF8JZAA-kdpZ0boqkxvG3DxPWnmw1GTojA8EI9Lb8J2O7ZopBPuSjwrB9sEyMU6GdJjFUndcLlxaNtjWCsSHdd6RCh7xJwFC8v0/s1600/p107_1.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmLc5fpMEZS8xFaW4pj0n4ZPSImvk1-1lOq_Ec0LY4nF8JZAA-kdpZ0boqkxvG3DxPWnmw1GTojA8EI9Lb8J2O7ZopBPuSjwrB9sEyMU6GdJjFUndcLlxaNtjWCsSHdd6RCh7xJwFC8v0/s1600/p107_1.gif&quot; height=&quot;233&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;このネットワークを以下の行列で表現することができる.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;
&lt;table cellpadding=&#39;5&#39; cellspacing=&#39;0&#39; border=&#39;1&#39; align=&#39;center&#39;&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&lt;b&gt;A&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;B&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;D&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;E&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;F&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;G&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;A&lt;/b&gt;&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;21&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;B&lt;/b&gt;&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;td&gt;17&lt;/td&gt;&lt;td&gt;20&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;td&gt;28&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;td&gt;31&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;D&lt;/b&gt;&lt;/td&gt;&lt;td&gt;21&lt;/td&gt;&lt;td&gt;17&lt;/td&gt;&lt;td&gt;28&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;td&gt;18&lt;/td&gt;&lt;td&gt;19&lt;/td&gt;&lt;td&gt;23&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;E&lt;/b&gt;&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;td&gt;20&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;td&gt;18&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;F&lt;/b&gt;&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;td&gt;31&lt;/td&gt;&lt;td&gt;19&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;td&gt;27&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;G&lt;/b&gt;&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;td&gt;23&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;27&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;しかし, このネットワークを, 全ての頂点が連結であるように適当な辺を除いた上で最適化することが出来る. 節約される量が最大化されるように取り除いたネットワークが以下の画像である. この場合, 辺の重みの総和は93であり, 元のネットワークからの節約量は 243 - 93 = 150 である.&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAdHszeeSFH-EKHBwAFpip5WTBDzFV9tSQTSsJvnEDS6cfYMytwYdoy9yptDtpbvjgPiaoeX-iRqULfkdadooSn2DRvWqOvQ8hdgFzbGFE3YvBur1fp66i6MbqukyHl1PziwmOan1e7J0/s1600/p107_2.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAdHszeeSFH-EKHBwAFpip5WTBDzFV9tSQTSsJvnEDS6cfYMytwYdoy9yptDtpbvjgPiaoeX-iRqULfkdadooSn2DRvWqOvQ8hdgFzbGFE3YvBur1fp66i6MbqukyHl1PziwmOan1e7J0/s1600/p107_2.gif&quot; height=&quot;239&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;6Kバイトのテキストファイル &lt;a href=&quot;https://projecteuler.net/project/resources/p107_network.txt&quot;&gt;network.txt&lt;/a&gt; (右クリックして保存すること) には40頂点のネットワークを行列表示したものが記されている. ネットワーク全体が連結であるが冗長な辺を取り除いたときの節約量を最大にするようにした場合の節約量を答えよ.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;注意！！！&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;自力で解きたい人へ&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;以降の記述には解法に関するネタバレが含まれます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;私の回答例は以下の通りです。&lt;/span&gt;&lt;br /&gt;
&lt;pre class=&quot;brush:python;collapse:true&quot; title=&quot;問１０７&quot;&gt;
def f(sIn):
&amp;#9;pIn = open(sIn)
&amp;#9;L0 = pIn.read().replace(&quot;\n&quot;, &quot;,&quot;).split(&quot;,&quot;)
&amp;#9;pIn.close()
&amp;#9;pIn = None
&amp;#9;n = int(len(L0)**.5)
&amp;#9;L1, a = [], 0
&amp;#9;for i, w in enumerate(L0):
&amp;#9;&amp;#9;if not w.isdigit(): continue
&amp;#9;&amp;#9;w, (y, x) = int(w), divmod(i, n)
&amp;#9;&amp;#9;if x&amp;lt;y:
&amp;#9;&amp;#9;&amp;#9;L1.append((w, (x, y)))
&amp;#9;&amp;#9;&amp;#9;a += w

&amp;#9;c, V, E = 0, [i for i in xrange(n)], []
&amp;#9;for w, (v1, v2) in sorted(L1):
&amp;#9;&amp;#9;if V[v1]!=V[v2]:
&amp;#9;&amp;#9;&amp;#9;c += w
&amp;#9;&amp;#9;&amp;#9;E.append(((v1, v2),w))
&amp;#9;&amp;#9;&amp;#9;minv, maxv = min(V[v1], V[v2]), max(V[v1], V[v2])
&amp;#9;&amp;#9;&amp;#9;for i,s in enumerate(V):
&amp;#9;&amp;#9;&amp;#9;&amp;#9;if s==maxv: V[i] = minv
&amp;#9;&amp;#9;&amp;#9;if not sum(V): break
&amp;#9;return a-c, a, c, E

s = &quot;p107_network.csv&quot;
sIn = os.path.join(os.path.dirname(__file__), s)
s, a, c, E = f(sIn)
print &quot;saving:&quot;, s
print &quot;all :&quot;, a
print &quot;cut :&quot;, c
print &quot;edge:&quot;, E
&lt;/pre&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　問題文では「冗長な辺を取り除いて」とありますが、重い辺を順に除外していくと、&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;重い辺の代わりに軽い辺を複数除外する方が全体として軽くなる場合に、&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;重い辺の除外を解除しなくてはいけなくなり、ロジックが複雑になります。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;そこで、軽い辺を順に採用していくことにします。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;ただし、辺を１つ採用するごとに新しくつながる頂点または頂点群が増えることが条件です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;これを全頂点を網羅するまで続けます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　頂点または頂点群が増えるかどうかの判定は、各頂点ごとにつながっている最小頂点番号で判定します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;最初は自分だけなので、各頂点とも最小頂点番号に自分自身の頂点番号を設定します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　そして、重みの軽い辺から順にその両端点の最小頂点番号が異なる場合に採用し、&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;両端点の最小頂点番号も洗い直しておきます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;すべての頂点の最小頂点番号が0になれば終了です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;最大頂点番号でも同様のことが可能ですが、終了判定がわかりやすいので最小頂点番号を使用します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;また、辺には向きが無いので、頂点番号の小さい方から大きい方への辺のみ使用します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;１．関数f(sIn)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;ネットワーク情報のcsvファイルを入力し、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;重みの節約数、重みの合計、カット後の重み合計、採用する辺のリストを返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・L0は:入力ファイルのcsv区切りのリストです。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　改行文字と半角カンマで区切ってリストにします。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・変数nは頂点数です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　リストL0は各頂点を行列表示しているので、頂点数nはリストL0の平方根になります。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・リストL1は辺のリストです。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　(重み、（頂点番号１、頂点番号２）)のタプルをためます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　ただし、重みは数値で、頂点番号１＜頂点番号２の場合に限ります。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・aは重みの総合計です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・wは重み、xは列番号、yは行番号です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　リストL0は行列表示を一次配列にしているので、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　その通し番号iを頂点数nで割った商が行番号y、余りが列番号xになります。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　divmod関数で商と余りを一度に求めています。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・リストVは最小頂点番号のリストです。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　V[i]は頂点iがつながっている最小頂点番号です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　初期値は各頂点の自分自身の頂点番号です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・リストEは採用した辺のリストです。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・辺のリストL1をソートして１つずつ処理します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　ソートキーは未指定の場合は最初の要素なので、この場合、重みに軽い順になります。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・v1、v2は辺の両端の頂点番号です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　このそれぞれのつながっている最小頂点番号が異なる場合、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　まだつながっていない頂点または頂点群なので、辺を採用します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・minv, maxvは、採用した辺の両端点がそれぞれつながっている最小頂点番号の&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　小さい方と大きい方です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　最小頂点番号リストVで、値がこの小さい方の場合、大きい方の値に洗いなおします。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・最後に、最小頂点番号リストVの全要素の和をチェックし、&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;この和が0ならば全頂点から0番目の頂点につながったということになるので処理終了です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;解答はこのすぐ下の行です。文字の色を白にしてます。選択状態にすると見えます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;saving: 259679&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: white; font-family: Courier New, Courier, monospace;&quot;&gt;all : 261832&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: white; font-family: Courier New, Courier, monospace;&quot;&gt;cut : 2153&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;edge: [((21, 36), 1), ((27, 34), 6), ((10, 33), 7), ((28, 34), 9), ((13, 39), 17&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;), ((4, 35), 19), ((9, 29), 25), ((5, 25), 27), ((20, 28), 27), ((3, 9), 32), ((&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;5, 34), 33), ((7, 9), 35), ((8, 15), 36), ((9, 13), 36), ((29, 37), 36), ((11, 1&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;7), 41), ((6, 10), 42), ((2, 9), 47), ((28, 37), 48), ((9, 10), 50), ((8, 24), 5&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;3), ((10, 19), 53), ((5, 36), 54), ((0, 31), 56), ((5, 23), 66), ((12, 29), 68),&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp;((15, 31), 68), ((16, 18), 73), ((3, 38), 76), ((20, 30), 80), ((22, 28), 83),&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;((14, 26), 89), ((35, 36), 91), ((1, 37), 102), ((26, 32), 102), ((11, 21), 104)&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;, ((2, 26), 108), ((1, 16), 122), ((0, 18), 131)]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sozorogusa.blogspot.com/feeds/1358979643790486597/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sozorogusa.blogspot.com/2015/03/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/1358979643790486597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/1358979643790486597'/><link rel='alternate' type='text/html' href='http://sozorogusa.blogspot.com/2015/03/blog-post.html' title='プロジェクトオイラー　問１０７'/><author><name>こむ</name><uri>http://www.blogger.com/profile/10736571744712318490</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmLc5fpMEZS8xFaW4pj0n4ZPSImvk1-1lOq_Ec0LY4nF8JZAA-kdpZ0boqkxvG3DxPWnmw1GTojA8EI9Lb8J2O7ZopBPuSjwrB9sEyMU6GdJjFUndcLlxaNtjWCsSHdd6RCh7xJwFC8v0/s72-c/p107_1.gif" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5705819268459585346.post-2946732123071634120</id><published>2015-02-01T08:56:00.000+09:00</published><updated>2015-02-01T08:56:09.889+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python"/><title type='text'>プロジェクトオイラー　問１０６</title><content type='html'>&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;プロジェクトオイラー(Project Euler)の問題をpythonでやってみます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;日本語翻訳サイトは、プロジェクトオイラー日本語 でネット検索です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;問１０６「特殊和集合:メタ検査」&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;大きさ n の集合 A の要素の和を S(A) で表す. 空でなく共通要素を持たないいかなる 2 つの部分集合 B と C に対しても以下の性質が真であれば, A を特殊和集合と呼ぼう.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;i. S(B)≠S(C); つまり, 部分集合の和が等しくてはならない.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;ii. B が C より多くの要素を含んでいればこのとき S(B) &amp;gt; S(C) となる.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;本問題に対しては, 与えられた集合は n 個の単調増加する要素を含み, かつ第二のルールをすでに満たしているものと仮定しよう.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;驚くべきことに, n = 4 の集合から得ることができる 25 個の可能な部分集合の対のうち,&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;1 個の対のみが 同一性（第一のルール）をテストされる必要がある.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;同様に, n = 7 のときは, 966 個の部分集合の対のうち 70 個のみがテストされる必要がある.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;n = 12 に対して, 得られる 261625 個の部分集合の対のうち, 同一性をテストされる必要があるものは何個か.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;注意: この問題は &lt;a href=&quot;http://sozorogusa.blogspot.jp/2015/01/blog-post_11.html&quot;&gt;Problem 103&lt;/a&gt; と 105 に関連している.！！！&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;注意！！！&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;自力で解きたい人へ&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;以降の記述には解法に関するネタバレが含まれます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;私の回答例は以下の通りです。&lt;/span&gt;&lt;br /&gt;
&lt;pre class=&quot;brush:python;collapse:true&quot; title=&quot;問１０６&quot;&gt;
def f(n):
&amp;#9;import itertools
&amp;#9;c = 0
&amp;#9;for i in xrange(2, n//2+1):
&amp;#9;&amp;#9;L = [t for t in itertools.combinations(xrange(n), i)]
&amp;#9;&amp;#9;for j, t0 in enumerate(L):
&amp;#9;&amp;#9;&amp;#9;for t1 in L[:j]:
&amp;#9;&amp;#9;&amp;#9;&amp;#9;for s in t1:
&amp;#9;&amp;#9;&amp;#9;&amp;#9;&amp;#9;if s in t0: break
&amp;#9;&amp;#9;&amp;#9;&amp;#9;else:
&amp;#9;&amp;#9;&amp;#9;&amp;#9;&amp;#9;for s,t in zip(t0, t1):
&amp;#9;&amp;#9;&amp;#9;&amp;#9;&amp;#9;&amp;#9;if s&amp;lt;t: c += 1; break
&amp;#9;return c

n = 12
print f(n)
&lt;/pre&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;問題文にあるとおり、問１０３の関連問題です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;まず、与えられた集合はn個の単調増加する要素を含むことが前提なので、要素が２つ以上の部分集合が対象です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;また、ルールiiを満たしていることが前提なので、要素数が同じ部分集合同士が対象外です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;以上から、ルールiをチェックする部分集合ペアとして、以下の条件のものの件数を数えます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・要素数が同じ&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・同じ要素を持たない&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・同じ項番の値でその大小が混在すること&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;なお、総当りで試しているので１分ルールに合うのはn=14までです。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;当問題はn=12なのでこの方法でよしとします。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;１．関数f(n)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・問題にある、同一性をテストされる必要がある部分集合の個数を返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　引数nは特殊和集合の要素数です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・変数cは求める部分集合数です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・ループ変数iは、比較する部分集合の要素数です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　要素数が2個からnの半分までです。半分を超えると必ず同じ要素が含まれてしまいます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・リストLは、0からn-1までのn個の値からi個選ぶ組合せのタプル群です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・t0,t1が比較する部分集合の候補同士です。どちらもリストLの要素です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　重複の無駄を避けるため、enumerate関数で0からの連番を発行し、&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;リストL内の組合せ順でt0よりも先に作成される部分集合からt1として取り出します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・同じ要素がないことの確認方法は以下の通りです。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　部分集合t1から要素を変数sとして順に取り出し、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;変数sが１つでも部分集合t0に存在すれば、ループを終了し次のペアの処理へ進みます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;変数sのすべてで部分集合t0に存在しなければ、else句へ進み次のチェックをします。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・同じ項番の値で大小が混在することの確認方法は以下の通りです。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　zip関数でt0とt1の同じ位置の値をそれぞれs, tとして設定します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　このときt1の方がt0よりも、組合せ順で先に作成されるので、部分集合t0の要素sよりも&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;部分集合t1の要素tの方が小さい値を持つはずで、これと逆にs&amp;lt;tとなるtが１つでもあれば大小混在となり、チェック対象の部分集合数のカウンタcを１つアップして比較操作を抜けます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　すべてのs,tで大小混在が検出できなければ、次の比較ペアへ処理を進めます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;解答はこのすぐ下の行です。文字の色を白にしてます。選択状態にすると見えます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: white; font-family: Courier New, Courier, monospace;&quot;&gt;21384&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sozorogusa.blogspot.com/feeds/2946732123071634120/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sozorogusa.blogspot.com/2015/02/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/2946732123071634120'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/2946732123071634120'/><link rel='alternate' type='text/html' href='http://sozorogusa.blogspot.com/2015/02/blog-post.html' title='プロジェクトオイラー　問１０６'/><author><name>こむ</name><uri>http://www.blogger.com/profile/10736571744712318490</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5705819268459585346.post-2217942277612579917</id><published>2015-01-18T15:33:00.000+09:00</published><updated>2015-01-18T15:33:24.975+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python"/><title type='text'>プロジェクトオイラー　問１０５</title><content type='html'>&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;プロジェクトオイラー(Project Euler)の問題をpythonでやってみます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;日本語翻訳サイトは、プロジェクトオイラー日本語 でネット検索です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;問１０５「特殊和集合:検査」&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;大きさ n の集合 A の要素の和を S(A) で表す. 空でなく共通要素を持たないいかなる 2 つの部分集合 B と C に対しても以下の性質が真であれば, A を特殊和集合と呼ぼう.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;i. S(B)≠S(C); つまり, 部分集合の和が等しくてはならない.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;ii. B が C より多くの要素を含んでいればこのとき S(B) &amp;gt; S(C) となる.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;たとえば, {81, 88, 75, 42, 87, 84, 86, 65} は,&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;65 + 87 + 88 = 75 + 81 + 84 であるため特殊和集合ではないが,&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;{157, 150, 164, 119, 79, 159, 161, 139, 158} は&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;すべての可能な部分集合の対の組み合わせについて両方のルールを満たしており, また S(A) = 1286 である.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;7個 から 12個 の要素を含む 100 個の集合が記された 4K のテキストファイル &lt;a href=&quot;https://projecteuler.net/project/resources/p105_sets.txt&quot;&gt;sets.txt&lt;/a&gt; (右クリックして &quot;名前をつけてリンク先を保存&quot;) を用いて (上の二例はファイルの最初の 2 集合である), 特殊和集合 A1, A2, ... , Ak をすべて特定し, S(A1) + S(A2) + ... + S(Ak) を求めよ.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;注意: この問題は &lt;a href=&quot;http://sozorogusa.blogspot.jp/2015/01/blog-post_11.html&quot;&gt;Problem 103&lt;/a&gt; と 106 に関連している.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;注意！！！&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;自力で解きたい人へ&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;以降の記述には解法に関するネタバレが含まれます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;私の回答例は以下の通りです。&lt;/span&gt;&lt;br /&gt;
&lt;pre class=&quot;brush:python;collapse:true&quot; title=&quot;問１０５&quot;&gt;
def chk1(L):
&amp;#9;import itertools
&amp;#9;M = []
&amp;#9;for i in xrange(len(L)):
&amp;#9;&amp;#9;for j in itertools.combinations(L, i+1):
&amp;#9;&amp;#9;&amp;#9;s = sum(j)
&amp;#9;&amp;#9;&amp;#9;if s in M: return False
&amp;#9;&amp;#9;&amp;#9;M.append(s)
&amp;#9;return True

def chk2(L):
&amp;#9;a, b = (len(L)+1)//2, len(L)//2+1
&amp;#9;return sum(L[:a])&amp;gt;sum(L[b:])

def f(fn):
&amp;#9;c, s = 0, 0
&amp;#9;p = open(fn)
&amp;#9;for t in p.readlines():
&amp;#9;&amp;#9;L = sorted([int(u) for u in t.split(&quot;,&quot;)])
&amp;#9;&amp;#9;if chk1(L) and chk2(L): s += sum(L); c += 1
&amp;#9;p.close()
&amp;#9;p = None
&amp;#9;return s, c

t = os.path.join(os.path.dirname(__file__), &quot;p105_sets.txt&quot;)
s, c = f(t)
print &quot;sum &amp;nbsp;:&quot;, s
print &quot;count:&quot;, c
&lt;/pre&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;問題文にあるとおり、&lt;a href=&quot;http://sozorogusa.blogspot.jp/2015/01/blog-post_11.html&quot;&gt;問１０３&lt;/a&gt;の関連問題です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;特殊和集合のチェックは既に&lt;a href=&quot;http://sozorogusa.blogspot.jp/2015/01/blog-post_11.html&quot;&gt;問１０３&lt;/a&gt;でやっているので、そのまま流用しました。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;１．関数chk1(L)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・リストLが最適特殊和集合の以下の条件、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　i. S(B) ≠ S(C); つまり, 部分集合の和が等しくてはならない.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　を満たしていればTrue、満たしていなければFalseを返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・詳細は&lt;a href=&quot;http://sozorogusa.blogspot.jp/2015/01/blog-post_11.html&quot;&gt;問１０３&lt;/a&gt;を参照。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;２．関数chk2(L)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・リストLが最適特殊和集合の以下の条件、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　ii. B が C より多くの要素を含んでいればこのとき S(B) &amp;gt; S(C) となる.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　を満たしていればTrue、満たしていなければFalseを返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・詳細は&lt;a href=&quot;http://sozorogusa.blogspot.jp/2015/01/blog-post_11.html&quot;&gt;問１０３&lt;/a&gt;を参照。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;３．関数f(fn)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・入力ファイルのフルパスを受け取り、特殊和集合の合計値と個数を返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・入力ファイルを１行ずつ読み込み、カンマで分けて数値型の要素にして昇順に並べたリストLについて、特殊和集合の条件２つが成り立てば、変数cにためていきます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;解答はこのすぐ下の行です。文字の色を白にしてます。選択状態にすると見えます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: white; font-family: Courier New, Courier, monospace;&quot;&gt;sum &amp;nbsp;: 73702&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: white; font-family: Courier New, Courier, monospace;&quot;&gt;count: 28&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://sozorogusa.blogspot.com/feeds/2217942277612579917/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sozorogusa.blogspot.com/2015/01/blog-post_18.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/2217942277612579917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/2217942277612579917'/><link rel='alternate' type='text/html' href='http://sozorogusa.blogspot.com/2015/01/blog-post_18.html' title='プロジェクトオイラー　問１０５'/><author><name>こむ</name><uri>http://www.blogger.com/profile/10736571744712318490</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5705819268459585346.post-347122723126256346</id><published>2015-01-12T17:19:00.000+09:00</published><updated>2015-01-12T17:19:19.268+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python"/><title type='text'>プロジェクトオイラー　問１０４</title><content type='html'>&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;プロジェクトオイラー(Project Euler)の問題をpythonでやってみます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;日本語翻訳サイトは、プロジェクトオイラー日本語 でネット検索です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;問１０４「両端がパンデジタルなフィボナッチ数」&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;フィボナッチ数列は再帰的な関係によって定義される:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;F&lt;sub&gt;n&lt;/sub&gt; = F&lt;sub&gt;n-1&lt;/sub&gt; + F&lt;sub&gt;n-2&lt;/sub&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;F&lt;sub&gt;541&lt;/sub&gt; (113桁)は, 下9桁に1から9までの数字をすべて含む初めてのフィボナッチ数である.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;そして, F&lt;sub&gt;2749&lt;/sub&gt; (575桁)は, 頭から9桁に1から9までの数字をすべて含む初めてのフィボナッチ数である.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Fkが, 頭から9桁と下9桁のどちらも1から9までの数字をすべて含む初めてのフィボナッチ数とするとき, kを求めよ.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;注意！！！&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;自力で解きたい人へ&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;以降の記述には解法に関するネタバレが含まれます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;私の回答例は以下の通りです。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;lt;pre class=&quot;brush:python;collapse:true&quot; title=&quot;問１０４&quot;&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;def f(s):&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; white-space: pre;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;pl, ps = len(s), sorted(s)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;a, b, c, d, k, g, n = 1, 0, 1, 0, 1, 0, pl*2&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;while sorted(str(a)[:pl])!=ps or sorted(str(c)[-pl:])!=ps:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;a, b, c, d, k, m = a+b, a, c+d, c, k+1, len(str(a))-n&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;if pl&amp;lt;m:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;   &lt;/span&gt;u, v = 10**m, 10**n&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;   &lt;/span&gt;a, b, c, d, g = a//u, b//u, c%v, d%v, g+m&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; white-space: pre;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;g += len(str(a))&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;return k, g&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;P = &quot;123456789&quot;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;k, t = f(P)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;print &quot;k &amp;nbsp; &amp;nbsp;:&quot;, k&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;print &quot;digit:&quot;, t&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;lt;/pre&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;問題のまま実装すると、数千桁から数万桁の数値の加算に処理時間がかかり、とても１分では終わりません。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;フィボナッチ数の先頭と末尾それぞれの必要な桁数分だけ桁調整して計算します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;なお、桁調整の際に必要な桁を超える桁数は累積しておき、後で全体桁数を把握できるようにします。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;１．関数f(s)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・文字列sに含まれる文字が先頭と末尾に順不同で存在するフィボナッチ数での項番と桁数を返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・変数plは文字列sの文字列長、変数psは文字列sを1文字ずつ昇順に並べた要素として持つリストです。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・kはフィボナッチ数の項番、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　aはフィボナッチ数F&lt;sub&gt;k&lt;/sub&gt;の上から必要な桁数分、bはフィボナッチ数F&lt;sub&gt;k-1&lt;/sub&gt;の上から必要な桁数分、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　cはフィボナッチ数F&lt;sub&gt;k&lt;/sub&gt;の下から必要な桁数分、dはフィボナッチ数F&lt;sub&gt;n-1&lt;/sub&gt;の下から必要な桁数分、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　gはフィボナッチ数Fkの桁数です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・変数nは本問の計算に必要な桁数です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　大きな値にすると加算処理に時間がかかるので必要な桁数以上でなるべく小さな値とします。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　題意にあう必要なチェックをするために少なくとも引数sの文字数分は必要で、&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;また加算の繰り上がりの影響を吸収するためにさらに引数sの文字数分を考慮しておきます。&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;合わせて、計算に必要な桁数nは、引数sの2倍の値とします。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・whileループ内でのフィボナッチ数計算の継続チェックは以下の通りです。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　先頭と末尾を引数と同じ桁数だけ取り出して昇順に並べて、事前に用意した変数psと比較し、どちらかが不一致ならば処理を継続します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・whileループ内ではフィボナッチ数の計算をします。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　フィボナッチ数F&lt;sub&gt;k&lt;/sub&gt;、F&lt;sub&gt;k-1&lt;/sub&gt;の先頭部分a,bにそれぞれa+b、aを設定します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　フィボナッチ数F&lt;sub&gt;k&lt;/sub&gt;、F&lt;sub&gt;k-1&lt;/sub&gt;の末尾部分c,dにそれぞれc+d、cを設定します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　項番kを１つ進めます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　変数mは先頭部分から桁調整で減らす桁数で、フィボナッチ数の先頭部分の計算結果の桁数と計算に必要な桁数nの差です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・変数mはすぐに正の値になりますが、あまり頻繁に桁調整しなくても処理速度に影響ないので、mがplより大きい場合、先頭と末尾両方の桁調整を行います。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　変数uは先頭部分の末尾から減らす桁数分の10の累乗値で、フィボナッチ数F&lt;sub&gt;k&lt;/sub&gt;、F&lt;sub&gt;k-1&lt;/sub&gt;それぞれの先頭部分a,bをuで割った商を新たにa,bとします。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　変数vは末尾部分の先頭から減らす桁数分の10の累乗値で、フィボナッチ数F&lt;sub&gt;k&lt;/sub&gt;、F&lt;sub&gt;k-1&lt;/sub&gt;それぞれの末尾部分c,dをvで割った余りを新たにc,dとします。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　桁数gには調整して減らした桁数mを累積していきます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・フィボナッチ数の計算が終わりwhileループ終了後に、桁数gにはフィボナッチ数の先頭部分aの桁数を足して、全体桁数にしておきます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　なお、計算中に桁調整をしていなければ変数aはフィボナッチ数そのものです。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;解答はこのすぐ下の行です。文字の色を白にしてます。選択状態にすると見えます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: white; font-family: Courier New, Courier, monospace;&quot;&gt;k &amp;nbsp; &amp;nbsp;: 329468&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: white; font-family: Courier New, Courier, monospace;&quot;&gt;digit: 68855&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sozorogusa.blogspot.com/feeds/347122723126256346/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sozorogusa.blogspot.com/2015/01/blog-post_12.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/347122723126256346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/347122723126256346'/><link rel='alternate' type='text/html' href='http://sozorogusa.blogspot.com/2015/01/blog-post_12.html' title='プロジェクトオイラー　問１０４'/><author><name>こむ</name><uri>http://www.blogger.com/profile/10736571744712318490</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5705819268459585346.post-3536064768204995981</id><published>2015-01-11T21:27:00.000+09:00</published><updated>2015-01-11T21:27:26.525+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python"/><title type='text'>プロジェクトオイラー　問１０３</title><content type='html'>&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;プロジェクトオイラー(Project Euler)の問題をpythonでやってみます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;日本語翻訳サイトは、プロジェクトオイラー日本語 でネット検索です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;問１０３「特殊和集合:最適化」&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;大きさ n の集合 A の要素の和を S(A) で表す. 空でなく共通要素を持たないいかなる 2 つの部分集合 B と C に対しても以下の性質が真であれば, A を特殊和集合と呼ぼう.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;i. S(B) ≠ S(C); つまり, 部分集合の和が等しくてはならない.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;ii. B が C より多くの要素を含んでいればこのとき S(B) &amp;gt; S(C) となる.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;ある n に対し S(A) が最小化されていれば, それを最適特殊和集合と呼ぼう. はじめの 5 つの最適特殊和集合は下に与えられる.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;n = 1: {1}&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;n = 2: {1, 2}&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;n = 3: {2, 3, 4}&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;n = 4: {3, 5, 6, 7}&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;n = 5: {6, 9, 11, 12, 13}&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;ある最適集合 A = {a1, a2, ... , an} に対し, 次の最適集合は B = {b, a1+b, a2+b, ... ,an+b} となりそうである. ここで b は前列の「中央の」要素である.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;この「法則」を用いると n = 6 に対する最適集合は A = {11, 17, 20, 22, 23, 24} で, S(A) = 117 と予期するだろう. しかしこれは, 最適に近い集合を与えるアルゴリズムを用いたにすぎないため, 最適集合とはならない. n = 6 に対する最適集合は A = {11, 18, 19, 20, 22, 25} で, S(A) = 115 である. これに対応する集合の文字列は 111819202225 である.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;A を n = 7 に対する最適特殊集合とするとき, その集合の文字列を求めよ.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;注意: この問題は Problem 105 と 106 に関連している.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;注意！！！&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;自力で解きたい人へ&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;以降の記述には解法に関するネタバレが含まれます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;私の回答例は以下の通りです。&lt;/span&gt;&lt;br /&gt;
&lt;pre class=&quot;brush:python;collapse:true&quot; title=&quot;問１０３&quot;&gt;
def chk1(L):
&amp;#9;import itertools
&amp;#9;M = []
&amp;#9;for i in xrange(len(L)):
&amp;#9;&amp;#9;for j in itertools.combinations(L, i+1):
&amp;#9;&amp;#9;&amp;#9;s = sum(j)
&amp;#9;&amp;#9;&amp;#9;if s in M: return False
&amp;#9;&amp;#9;&amp;#9;M.append(s)
&amp;#9;return True

def chk2(L):
&amp;#9;a, b = (len(L)+1)//2, len(L)//2+1
&amp;#9;return sum(L[:a])&amp;gt;sum(L[b:])

def g(L):
&amp;#9;if not L: return [1]
&amp;#9;c = L[(len(L)-1)//2]
&amp;#9;for b in xrange(c, c+L[-1]):
&amp;#9;&amp;#9;M = [a+b for a in [0]+L]
&amp;#9;&amp;#9;if chk1(M) and chk2(M): return M

def f(n):
&amp;#9;M = []
&amp;#9;for i in xrange(n):
&amp;#9;&amp;#9;M, N, k = g(M), [[]], i//2
&amp;#9;&amp;#9;for j in M:
&amp;#9;&amp;#9;&amp;#9;L = xrange(max(1, j-k), j+k+1)
&amp;#9;&amp;#9;&amp;#9;N = [s+[t] for s in N for t in L if (not s) or s[-1]&amp;lt;t]
&amp;#9;&amp;#9;for L in N:
&amp;#9;&amp;#9;&amp;#9;if sum(L)&amp;lt;sum(M) and chk1(L) and chk2(L): M = L
&amp;#9;return &quot;&quot;.join([str(s) for s in M]), sum(M)

n = 7
t, s = f(n)
print &quot;str:&quot;, t
print &quot;sum:&quot;, s
&lt;/pre&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;ゼロベースで最適特殊集合を作り出そうとするととても１分で処理が終わりません。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;「最適に近い集合」が提示されているので、まずこれを基に各要素ごとにいくらかの幅を設定して候補値を選定します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;そしてこの「各要素ごとの候補値の組合せ」から最適特殊解集合を求めることにしました。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;１．関数chk1(L)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・リストLが最適特殊和集合の以下の条件、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　i. S(B) ≠ S(C); つまり, 部分集合の和が等しくてはならない.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　を満たしていればTrue、満たしていなければFalseを返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・リストLの部分集合の和を作成し、リストMに無ければためていき、あればFlseで終了します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・ループ変数iは、リストLから部分集合を作る際に取り出す要素数（0～）です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・ループ変数jは、組み合わせ関数combinationsを利用して、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　リストLからi+1個の要素を取り出した組み合わせ結果のタプルが設定されます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;２．関数chk2(L)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・リストLが最適特殊和集合の以下の条件、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　ii. B が C より多くの要素を含んでいればこのとき S(B) &amp;gt; S(C) となる.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　を満たしていればTrue、満たしていなければFalseを返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・この条件を満たすかどうかが一番厳しい部分集合の和同士でチェックします。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・一番厳しい部分集合の和同士は、要素を昇順に並べた集合の中で、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　要素が奇数個の場合、最小値から中央値までの和とそれより後の和同士、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　つまり{1,2,3,4,5}ならば、{1,2,3}と{4,5}の和を比較（この場合False）します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　要素が偶数個の場合、集合の前半の和と後半の２番目に小さい値以降の和同士、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　つまり{1,2,3,4,5,6}ならば、{1,2,3}と{5,6}の和を比較（この場合False）します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;３．関数g(L)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・リストLの次の「最適に近い集合」のリストを返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・次の「最適に近い集合」は、問題にあるロジックの通り、中央値と中央値を全要素に足した集合です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・Lが空集合の場合、要素が1だけのリストを返却します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;４．関数f(n)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・要素数がn個の最適特殊集合の要素連結文字列と和を返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・既知の最適特殊集合に基づいて要素数が1つ多い最適特殊集合をもとめていきます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　要素数が1個から始めてn個になるまで順に最適特殊集合を求めていきます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・リストMは既知の最適特殊集合で、関数gにより次の「最適に近い集合」を設定します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・ループ変数iはリストMの要素数です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・ループ変数jは最適に近い値を１つずつ設定します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・変数kは候補値の幅です。ここでは「最適に近い集合」の要素数の半分とします。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　要素数が４や５ならば各要素の±２に含まれる値を各要素の候補値とします。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　jのループ中で、各要素ごとの候補値リストLとして持ちます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・リストNは各要素の候補値の組合せリストです。なお昇順になる組合せのみ採用します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・候補値組合せリストNのループ内で、リストNの中から最適特殊集合を求めます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・「最適に近い集合」Mよりも和が小さいこと、最適特殊集合の条件２つに合うかチェックし、最適特殊集合として採用します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　チェックして合うものが無ければ、「最適に近い集合」Mを最適特殊集合とします。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;解答はこのすぐ下の行です。文字の色を白にしてます。選択状態にすると見えます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: white; font-family: Courier New, Courier, monospace;&quot;&gt;str: 20313839404245&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: white; font-family: Courier New, Courier, monospace;&quot;&gt;sum: 255&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://sozorogusa.blogspot.com/feeds/3536064768204995981/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sozorogusa.blogspot.com/2015/01/blog-post_11.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/3536064768204995981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/3536064768204995981'/><link rel='alternate' type='text/html' href='http://sozorogusa.blogspot.com/2015/01/blog-post_11.html' title='プロジェクトオイラー　問１０３'/><author><name>こむ</name><uri>http://www.blogger.com/profile/10736571744712318490</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5705819268459585346.post-818105506351722011</id><published>2015-01-03T10:42:00.000+09:00</published><updated>2015-01-03T10:42:22.035+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python"/><title type='text'>プロジェクトオイラー　問１０２</title><content type='html'>&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;プロジェクトオイラー(Project Euler)の問題をpythonでやってみます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;日本語翻訳サイトは、プロジェクトオイラー日本語 でネット検索です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;問１０２「三角形の包含」&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;3つの異なる点が -1000 ≦ x, y ≦ 1000 かつ三角形となるように, デカルト平面上にランダムに与えられる.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;以下の2つの三角形を考える.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;A(-340,495), B(-153,-910), C(835,-947)&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;X(-175,41), Y(-421,-714), Z(574,-645)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;三角形ABCが原点を内部に含み, XYZは原点を内部に含まないことが確かめられる.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;27Kのテキストファイル&lt;a href=&quot;https://projecteuler.net/project/resources/p102_triangles.txt&quot;&gt;triangles.txt&lt;/a&gt;(右クリックしリンク先を保存して欲しい) にランダムな1000個の三角形が適当なフォーマットのもと含まれている. 内部に原点を含む三角形の数を答えよ.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;注: ファイル中の最初の二つは三角形ABC, XYZである.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;注意！！！&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;自力で解きたい人へ&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;以降の記述には解法に関するネタバレが含まれます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;私の回答例は以下の通りです。&lt;/span&gt;&lt;br /&gt;
&lt;pre class=&quot;brush:python;collapse:true&quot; title=&quot;問１０２&quot;&gt;
def f(fn):
&amp;#9;c = 0
&amp;#9;p = open(fn)
&amp;#9;for s in p.readlines():
&amp;#9;&amp;#9;t, L, M = s.split(&quot;,&quot;), [], []
&amp;#9;&amp;#9;for i in xrange(0, len(t), 2): L.append((int(t[i]), int(t[i+1])))&amp;nbsp;
&amp;#9;&amp;#9;L.append(L[0])
&amp;#9;&amp;#9;for i in xrange(len(t)//2):
&amp;#9;&amp;#9;&amp;#9;a, b = L[i], (L[i+1][0]-L[i][0], L[i+1][1]-L[i][1])
&amp;#9;&amp;#9;&amp;#9;M.append(a[0]*b[1] - a[1]*b[0])
&amp;#9;&amp;#9;if abs(sum(M))==sum([abs(u) for u in M]): c += 1
&amp;#9;p.close()
&amp;#9;p = None
&amp;#9;return c

s = &quot;p102_triangles.txt&quot;
t = os.path.join(os.path.dirname(__file__), s)
print f(t)
&lt;/pre&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;原点が三角形の各辺の左右同じ側にあるかという位置関係で判定します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;ベクトルの外積を利用します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;対象となる点（当問題では原点）が三角形の内部にあれば、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;その点は三角形を一周して常に同じ側にあることになります。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;つまり、対象となる点（当問題では原点）から各頂点へのベクトルと、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;その頂点から次の頂点へのベクトルの外積の符号がすべて同じになります。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;なお、平面上の話なので、外積はベクトルにならずスカラー量です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;aベクトル：原点から三角形のi番目の頂点へのベクトル&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;bベクトル：i番目の点からi+1番目の点へのベクトル&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;として、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;aベクトルとbベクトルの外積の符号が、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;正ならばaベクトルが右側、つまり原点はbベクトルの左側で、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;負ならばaベクトルが左側、つまり原点はbベクトルの右側です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;３つの外積がすべて正ならば原点を右回りに一周し、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;３つの外積がすべて負ならば原点を左回りに一周することになります。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;外積の公式は以下のとおりです。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;aベクトル=(A&lt;sub&gt;x&lt;/sub&gt;, A&lt;sub&gt;y&lt;/sub&gt;)、bベクトル=(B&lt;sub&gt;x&lt;/sub&gt;, B&lt;sub&gt;y&lt;/sub&gt;)とすると、&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;a×b = A&lt;sub&gt;x&lt;/sub&gt;*B&lt;sub&gt;y&lt;/sub&gt; - A&lt;sub&gt;y&lt;/sub&gt;*B&lt;sub&gt;x&lt;/sub&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;以上を実装しました。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;１．関数f(fn)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・入力ファイルのフルパスを受け取り、問題にある内部に原点を含む三角形の数を返します。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・ループ変数sは、入力ファイルの１行分で、６つの数字のcsv文字列です。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・変数tは、６つの数字（まだ文字型）を持つリストです。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・一周して計算する都合上、最初の座標を最後にもう一度追加し&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;座標を４つ分にしてから外積計算を３回行います。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;リストLは、平面座標値（タプル型）を最初３つ持ち、最初の１つを末尾に追加して&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;計４つの座標値を持ちます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・変数a,bはそれぞれ上記の説明にあるaベクトルとbベクトルです。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・リストMには外積値をためていきます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;・外積の符号一致判定は、外積値の和の絶対値＝外積値の絶対値の和かどうかで行います。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;解答はこのすぐ下の行です。文字の色を白にしてます。選択状態にすると見えます。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: white; font-family: Courier New, Courier, monospace;&quot;&gt;228&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sozorogusa.blogspot.com/feeds/818105506351722011/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sozorogusa.blogspot.com/2015/01/blog-post_3.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/818105506351722011'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5705819268459585346/posts/default/818105506351722011'/><link rel='alternate' type='text/html' href='http://sozorogusa.blogspot.com/2015/01/blog-post_3.html' title='プロジェクトオイラー　問１０２'/><author><name>こむ</name><uri>http://www.blogger.com/profile/10736571744712318490</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>