<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>数奇な因子 &#187; uva</title>
	<atom:link href="http://www.numericalfactor.org/wp/tag/uva/feed" rel="self" type="application/rss+xml" />
	<link>http://www.numericalfactor.org/wp</link>
	<description>Numerical Factor</description>
	<lastBuildDate>Sun, 02 May 2010 09:50:48 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>134 Loglan &#8211; A Logical Language</title>
		<link>http://www.numericalfactor.org/wp/archives/253</link>
		<comments>http://www.numericalfactor.org/wp/archives/253#comments</comments>
		<pubDate>Sat, 12 Jan 2008 12:13:11 +0000</pubDate>
		<dc:creator>line</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[uva]]></category>

		<guid isPermaLink="false">http://www.numericalfactor.org/wp/archives/253</guid>
		<description><![CDATA[UVA134 Loglan &#8211; A Logical Language．

構文解析やるだけ．

構文解析木の節・葉にあたるところを全て関数に仕立てて(DAとかNAMまで)書いてたので，
無駄が多数．

実装に [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://icpcres.ecs.baylor.edu/onlinejudge/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=3&amp;page=show_problem&amp;problem=70">UVA134 Loglan &#8211; A Logical Language</a>．</p>

<p>構文解析やるだけ．</p>

<p>構文解析木の節・葉にあたるところを全て関数に仕立てて(DAとかNAMまで)書いてたので，
無駄が多数．</p>

<p>実装にだいぶ時間かかってしまってもいて，ダメだ…．</p>

<p>UVAは，URLの示す問題がどれなのかさっぱり分からなくなってしまっていて，
使いづらくなった．</p>

<p>という現実逃避でした．</p>
]]></content:encoded>
			<wfw:commentRss>http://www.numericalfactor.org/wp/archives/253/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>最近のgccは気を利かせすぎるようだ</title>
		<link>http://www.numericalfactor.org/wp/archives/214</link>
		<comments>http://www.numericalfactor.org/wp/archives/214#comments</comments>
		<pubDate>Mon, 20 Aug 2007 16:02:48 +0000</pubDate>
		<dc:creator>line</dc:creator>
				<category><![CDATA[algorithm]]></category>
		<category><![CDATA[misc]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[uva]]></category>

		<guid isPermaLink="false">http://www.numericalfactor.org/wp/archives/214</guid>
		<description><![CDATA[UVAに送信してて思った．

手元ではコンパイル通る（-Wall付きで）のに，向こうではコンパイルエラー．
よく見ると必要なライブラリをincludeしてない，ということが最近よく起こりました．

なんで #includ [...]]]></description>
			<content:encoded><![CDATA[<p>UVAに送信してて思った．</p>

<p>手元ではコンパイル通る（-Wall付きで）のに，向こうではコンパイルエラー．
よく見ると必要なライブラリをincludeしてない，ということが最近よく起こりました．</p>

<p>なんで #include&lt;cstdio&gt; が無いのに，何の問題もなくsprintf使えてるんだ…みたいな．</p>

<pre><code>gcc (GCC) 4.1.2 (Ubuntu 4.1.2-0ubuntu4)
</code></pre>

<p>使ってるコンパイラはこれですが，こういうのをチェックするオプションって無いんでしょうか．
バージョンが違うと，こうも動作が違うものか…．</p>

<p>関係ないけど，<a href="http://acm.uva.es/p/v3/369.html">UVA369</a>がちょっと面白かった．</p>

<p>組合せ数<sub>N</sub>C<sub>M</sub>を出せという話なんですが，5 &#8806; N, M &#8806; 100．定義通り書くとすると <img src='http://www.numericalfactor.org/wp/wp-content/uploads/texclip20070821005022.png' alt='N!/( (N-M)! * M!)' /> を計算するけど，
100の階乗って10の150乗より大きい値（問題文に書いてある）なわけで．</p>

<p>これに対応するには? 任意精度の整数を使えば出来ます．
階乗にする数は高々100なので，
1!から100!まで配列に入れといて必要になったら呼び出せば毎回計算せずに済む．
あとは定義通りに計算でおkと．</p>

<p>で，多倍長整数を使いたくない場合，
というか多分期待されてる回答はこれだと思うのですが．</p>

<p>私も多倍長整数使いたくないので何かいい性質がないかと<a href="http://ja.wikipedia.org/wiki/%E7%B5%84%E5%90%88%E3%81%9B_%28%E6%95%B0%E5%AD%A6%29">組合せ (数学) &#8211; Wikipedia</a>
を読んでたら，ありました．つかこの程度の知識は持っとけと言われるかも．</p>

<p><img src='http://www.numericalfactor.org/wp/wp-content/uploads/texclip20070821005521.png' alt='{}_N \mathrm{C} _M = {}_{N-1} \mathrm{C} _M + {}_{N-1} \mathrm{C} _{M-1}' /></p>

<p>ある二つの組合せ数が分かってれば次の一つが計算できると．
というわけで次のようなN&times;Mの表を作ります．</p>

<table>
<thead>
<tr>
  <th>N\M</th>
  <th>1</th>
  <th>2</th>
  <th>3</th>
  <th>4</th>
  <th>5</th>
  <th>6</th>
  <th>7</th>
  <th>8</th>
</tr>
</thead>
<tbody>
<tr>
  <td>1</td>
  <td>1</td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
</tr>
<tr>
  <td>2</td>
  <td>2</td>
  <td>1</td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
</tr>
<tr>
  <td>3</td>
  <td>3</td>
  <td></td>
  <td>1</td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
</tr>
<tr>
  <td>4</td>
  <td>4</td>
  <td></td>
  <td></td>
  <td>1</td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
</tr>
<tr>
  <td>5</td>
  <td>5</td>
  <td></td>
  <td></td>
  <td></td>
  <td>1</td>
  <td></td>
  <td></td>
  <td></td>
</tr>
<tr>
  <td>6</td>
  <td>6</td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td>1</td>
  <td></td>
  <td></td>
</tr>
<tr>
  <td>7</td>
  <td>7</td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td>1</td>
  <td></td>
</tr>
<tr>
  <td>8</td>
  <td>8</td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td>1</td>
</tr>
</tbody>
</table>

<p><sub>N</sub>C<sub>N</sub>=1，<sub>N</sub>C<sub>1</sub>=nが分かればこれだけ埋められます．問題文にM &#8806; Nだと書いてある（組合せ数だからこれは当然）ので，表の左下三角部分だけ埋めれば良い．</p>

<p>ここでさっきの式が使えるわけですね．この表ではNは下方向に，Mは右方向に向かってそれぞれ増えていくので，式を当てはめると，あるセルAの上と左上のセルの値が分かればその和がセルAの値! という話になります．</p>

<table>
<thead>
<tr>
  <th>N\M</th>
  <th>1</th>
  <th>2</th>
  <th>3</th>
  <th>4</th>
  <th>5</th>
  <th>6</th>
  <th>7</th>
  <th>8</th>
</tr>
</thead>
<tbody>
<tr>
  <td>1</td>
  <td>1</td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
</tr>
<tr>
  <td>2</td>
  <td>2</td>
  <td>1</td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
</tr>
<tr>
  <td>3</td>
  <td>3</td>
  <td>3</td>
  <td>1</td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
</tr>
<tr>
  <td>4</td>
  <td>4</td>
  <td>6</td>
  <td>4</td>
  <td>1</td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
</tr>
<tr>
  <td>5</td>
  <td>5</td>
  <td>10</td>
  <td>10</td>
  <td>5</td>
  <td>1</td>
  <td></td>
  <td></td>
  <td></td>
</tr>
<tr>
  <td>6</td>
  <td>6</td>
  <td>15</td>
  <td>20</td>
  <td>15</td>
  <td>6</td>
  <td>1</td>
  <td></td>
  <td></td>
</tr>
<tr>
  <td>7</td>
  <td>7</td>
  <td>21</td>
  <td>35</td>
  <td></td>
  <td></td>
  <td></td>
  <td>1</td>
  <td></td>
</tr>
<tr>
  <td>8</td>
  <td>8</td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td>1</td>
</tr>
</tbody>
</table>

<p>こんな感じ．上の解法とは違って和しかとらないので簡単．しかも問題文にあるように全ての計算がlongで収まるので多倍長の計算が不要．そしてN&times;Mは高々10,000でしかなく，和もその半分の回数程度しか計算しないので速い．</p>

<p>長々と書いたけど，おそらくこの問題やるような人であればほぼ確実に知ってそうな気がする．</p>

<p>Equation images by <a href="http://maru.bonyari.jp/texclip/">TexClip</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.numericalfactor.org/wp/archives/214/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>やっと100問@UVA</title>
		<link>http://www.numericalfactor.org/wp/archives/213</link>
		<comments>http://www.numericalfactor.org/wp/archives/213#comments</comments>
		<pubDate>Sun, 19 Aug 2007 11:10:47 +0000</pubDate>
		<dc:creator>line</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[uva]]></category>

		<guid isPermaLink="false">http://www.numericalfactor.org/wp/archives/213</guid>
		<description><![CDATA[一念発起してここ数日はUVA days．
やっと100問ACを達成．

人が解いたやさしい問題だけ解いてるんでどうということはないんですが，
小さな達成感を味わったり．

相変わらずDP/メモ付き探索が苦手．
グラフとか [...]]]></description>
			<content:encoded><![CDATA[<p>一念発起してここ数日は<a href="http://acm.uva.es/problemset/">UVA</a> days．
やっと100問ACを達成．</p>

<p>人が解いたやさしい問題だけ解いてるんでどうということはないんですが，
小さな達成感を味わったり．</p>

<p>相変わらずDP/メモ付き探索が苦手．
グラフとかの基本的なアルゴリズムすら怪しいですけどね!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.numericalfactor.org/wp/archives/213/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>uva117</title>
		<link>http://www.numericalfactor.org/wp/archives/193</link>
		<comments>http://www.numericalfactor.org/wp/archives/193#comments</comments>
		<pubDate>Mon, 28 May 2007 04:19:33 +0000</pubDate>
		<dc:creator>line</dc:creator>
				<category><![CDATA[algorithm]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[uva]]></category>

		<guid isPermaLink="false">http://www.numericalfactor.org/wp/archives/193</guid>
		<description><![CDATA[UVA の The Postal Worker Rings Once を解いた．

題意は，与えられた連結グラフにおいて，全ての辺を少なくとも一度通る閉路のうち最小となるコストを出力せよ．

ただし奇数次の頂点は高々 2 [...]]]></description>
			<content:encoded><![CDATA[<p>UVA の <a href="http://acm.uva.es/p/v1/117.html">The Postal Worker Rings Once</a> を解いた．</p>

<p>題意は，与えられた連結グラフにおいて，全ての辺を少なくとも一度通る閉路のうち最小となるコストを出力せよ．</p>

<p>ただし奇数次の頂点は高々 2 つ．</p>

<p>サンプル入力のグラフを図にするとこんな感じ:
<a href='http://www.numericalfactor.org/wp/wp-content/uploads/uva117_2.png' title='uva117' rel="lightbox"><img src='http://www.numericalfactor.org/wp/wp-content/uploads/uva117.png' alt='uva117.png' /></a></p>

<p>だいぶバグって情けない感じだったけど，通しました．
まず入力をコード上で使い易い形に落とすのが面倒だった…．</p>

<p>さて，「奇数次の頂点が高々2つ」という条件がキモ．つまり与えられるグラフは（準）オイラーグラフ．</p>

<p>ということで，グラフの種類により場合分けすれば良い．</p>

<dl>
<dt>オイラーグラフ</dt>
<dd>ある頂点から始めて全ての辺を通りそこに戻ってくる一筆書きがある．つまり，全ての辺のコストの和が答え．</dd>

<dt>準オイラーグラフ</dt>
<dd>2 つの奇数次の頂点を v1, v2 とすると，v1から始めて全ての辺を通りv2に至るような一筆書きがある．つまり，（v1からv2へ至る一筆書き + v2からv1への最短経路）の総コストが答え．</dd>
</dl>

<p>オイラーグラフなら全ての頂点は偶数次だし，準オイラーグラフなら奇数次の頂点が二つ，という点で判定できる．</p>

<p>奇数次の頂点が1つということはない．これは，連結グラフだし，問題文で「ある頂点から出てそこにまた入る辺は存在しないし，任意の2頂点間を直接繋ぐ辺は高々一つ，任意の2頂点間を繋ぐパスが存在する」と言っている．直感的には，上の条件から，グラフに辺を一つ追加したら互いに異なる2つの頂点の次数がそれぞれ 1 増えるので，ある頂点が奇数次なら必ずもう一つ奇数次の頂点が存在する，という感じでしょうか．</p>

<p>書いたダイクストラ法がバグってて，数回 Wrong Answer 喰らってしまった．</p>
]]></content:encoded>
			<wfw:commentRss>http://www.numericalfactor.org/wp/archives/193/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
