<?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>Earthson&#039;s Blog</title>
	<atom:link href="http://www.earthson.net/feed" rel="self" type="application/rss+xml" />
	<link>http://www.earthson.net</link>
	<description>即使这个社会已经腐烂，也不意味着我们应该跟着一起腐烂！</description>
	<lastBuildDate>Sat, 12 Nov 2011 12:21:13 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
	<atom:link rel='hub' href='http://www.earthson.net/?pushpress=hub'/>
		<item>
		<title>差分序列</title>
		<link>http://www.earthson.net/archives/618</link>
		<comments>http://www.earthson.net/archives/618#comments</comments>
		<pubDate>Thu, 29 Sep 2011 09:29:59 +0000</pubDate>
		<dc:creator>Earthson</dc:creator>
				<category><![CDATA[ACM]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Math]]></category>
		<category><![CDATA[数列]]></category>

		<guid isPermaLink="false">http://www.earthson.net/?p=618</guid>
		<description><![CDATA[不小心遇到一题4次求和，推公式推了好久。。想想实在是没有必要，每次遇到还得推一边实在是累。。所以，回来就写了一个差分的版本，单次计算的效率不比直接公式差，不容易出错，而且，再也不用蛋去推多项式公式了 至于什么是差分序列，这个我就不解释了，wiki上应该可以找到。我的写法是借鉴了牛顿插值的，使用了一个递推的写法（一般求多项式都会用这个， 比如4n^3 + n^2 + 2 * n + 3，一般写成 ((4n + 1) * n + 2) * n + 3） 初始化细节说明：order是生成的多项式的阶，请确保它大于或等于实际的多项式阶。order阶的多项式需要用order+1项进行init，请把这前order+1项存入数组cof中。最后调用init函数，就可以用calc来计算任意项了。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 [...]]]></description>
			<content:encoded><![CDATA[<p>不小心遇到一题4次求和，推公式推了好久。。想想实在是没有必要，每次遇到还得推一边实在是累。。所以，回来就写了一个差分的版本，单次计算的效率不比直接公式差，不容易出错，而且，再也不用蛋去推多项式公式了</p>
<p>至于什么是差分序列，这个我就不解释了，wiki上应该可以找到。我的写法是借鉴了牛顿插值的，使用了一个递推的写法（一般求多项式都会用这个， 比如4n^3 + n^2 + 2 * n + 3，一般写成 ((4n + 1) * n + 2) * n + 3）</p>
<p><b>初始化细节说明</b>：order是生成的多项式的阶，请确保它大于或等于实际的多项式阶。order阶的多项式需要用order+1项进行init，请把这前order+1项存入数组cof中。最后调用init函数，就可以用calc来计算任意项了。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">/******************************************************************************
  * Differential Sequence
  * init: O(order^2)
  * you should init the cof[i] with the value of i-th value of sequence
  * the sequene start from startfrom, default is 0, so a[0] is the first one
  * 	of sequence a
  * calc: O(order)
  ****************************************************************************/</span>
&nbsp;
<span style="color: #993333;">const</span> <span style="color: #993333;">int</span> ORDERLIM <span style="color: #339933;">=</span> <span style="color: #0000dd;">100</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">double</span> cof<span style="color: #009900;">&#91;</span>ORDERLIM <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> order<span style="color: #339933;">;</span>
<span style="color: #993333;">const</span> <span style="color: #993333;">int</span> startfrom <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">void</span> init<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> j<span style="color: #339933;">;</span>
	<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;=</span> order<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>j <span style="color: #339933;">=</span> order<span style="color: #339933;">;</span> j <span style="color: #339933;">&gt;=</span> i<span style="color: #339933;">;</span> j<span style="color: #339933;">--</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			cof<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">-=</span> cof<span style="color: #009900;">&#91;</span>j <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">double</span> calc<span style="color: #009900;">&#40;</span><span style="color: #993333;">double</span> n<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">int</span> i<span style="color: #339933;">;</span>
	<span style="color: #993333;">double</span> res <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> order<span style="color: #339933;">;</span> i <span style="color: #339933;">&gt;</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i<span style="color: #339933;">--</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		res <span style="color: #339933;">+=</span> cof<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		res <span style="color: #339933;">*=</span> <span style="color: #009900;">&#40;</span>n <span style="color: #339933;">-</span> i <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span> <span style="color: #339933;">-</span> startfrom<span style="color: #009900;">&#41;</span> <span style="color: #339933;">/</span> i<span style="color: #339933;">;</span>	
	<span style="color: #009900;">&#125;</span>
	res <span style="color: #339933;">+=</span> cof<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">return</span> res<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/******************************************************************************
  * MOD version of Differential Sequence
  * cof should not overflow MOD
  * MOD should should not less than order
  * MOD should be prime
  * need inverse in mod MOD system
  ****************************************************************************/</span>
typec MOD <span style="color: #339933;">=</span> <span style="color: #0000dd;">1000000007</span><span style="color: #339933;">;</span>
typec cof<span style="color: #009900;">&#91;</span>ORDERLIM <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
typec inv<span style="color: #009900;">&#91;</span>ORDERLIM <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> order<span style="color: #339933;">;</span>
<span style="color: #993333;">const</span> <span style="color: #993333;">int</span> startfrom <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">void</span> init<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> j<span style="color: #339933;">;</span>
	<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;=</span> order<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		inv<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> inverse<span style="color: #009900;">&#40;</span>i<span style="color: #339933;">,</span> MOD<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>j <span style="color: #339933;">=</span> order<span style="color: #339933;">;</span> j <span style="color: #339933;">&gt;=</span> i<span style="color: #339933;">;</span> j<span style="color: #339933;">--</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			cof<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">-=</span> cof<span style="color: #009900;">&#91;</span>j <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
typec calc<span style="color: #009900;">&#40;</span>typec n<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">int</span> i<span style="color: #339933;">;</span>
	typec res <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> order<span style="color: #339933;">;</span> i <span style="color: #339933;">&gt;</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i<span style="color: #339933;">--</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		res <span style="color: #339933;">+=</span> cof<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> res <span style="color: #339933;">%=</span> MOD<span style="color: #339933;">;</span>
		res <span style="color: #339933;">*=</span> <span style="color: #009900;">&#40;</span>n <span style="color: #339933;">-</span> i <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span> <span style="color: #339933;">-</span> startfrom<span style="color: #009900;">&#41;</span> <span style="color: #339933;">%</span> MOD <span style="color: #339933;">*</span> inv<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">%</span> MOD<span style="color: #339933;">;</span>
		res <span style="color: #339933;">%=</span> MOD<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	res <span style="color: #339933;">+=</span> cof<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> res <span style="color: #339933;">%=</span> MOD<span style="color: #339933;">;</span>
	<span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>res <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> res <span style="color: #339933;">+=</span> MOD<span style="color: #339933;">;</span>
	<span style="color: #b1b100;">return</span> res<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.earthson.net/archives/618/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Lucas定理推广（组合数取模）</title>
		<link>http://www.earthson.net/archives/577</link>
		<comments>http://www.earthson.net/archives/577#comments</comments>
		<pubDate>Wed, 20 Apr 2011 16:23:18 +0000</pubDate>
		<dc:creator>Earthson</dc:creator>
				<category><![CDATA[ACM]]></category>
		<category><![CDATA[Math]]></category>
		<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[数论]]></category>
		<category><![CDATA[组合]]></category>

		<guid isPermaLink="false">http://www.earthson.net/?p=577</guid>
		<description><![CDATA[比赛的时候，意外想到了个方法来处理组合数取模。一推，发现就是Lucas定理，并且，在模数是素数乘方的情况作了些推广。使得lucas能够处理模任意数的组合数取模。 Lucas定理 首先给出Lucas定理的递归描述 简要证明思路： 考虑连续的p个整数（p是素数），把能整除p的那个数除去，然后取模，再乘起来模p其实是-1(*)。注意，因为和p互素的原因，这东西是可约的。 再考虑这个组合公式 上下都有k项，你能取的长度为p的连续整数有k/p段(从后往前取)，每一段去掉那个能被p整除的数，然后，上下因为有相同的段数，所以就被约掉了（明白为什么在这种情况下是可约的么？）。 为什么能被p整除的数要被单独的拉出来呢？因为，和模数有公因子的数加入取模运算会导致不可逆。所以这些能被p整除的数需要被提取出来单独处理。 于是，有了后面部分的C(n/p, k/p)，其实就是每个被提取出来的数再提取了一个因子p（因为上下提取出来的数一样多，所以，这些p自然就被约掉了）。然后，你幸运的发现，他是个组合数，于是问题被递归。最后，我们还有个前缀没有被处理。但是，因为模数是p，所以有下面公式 把这写合并在一起，就有了Lucas定理的递归表述（公式1） 推广的Lucas 那么要怎么处理模数是素数p的乘方的情形呢？其实是一样的，只不过，有些东西就不再退化了，比如公式6。我们可以用同样的方式，先把因子p全部提取出来单独处理，于是得到如下的公式，来处理p的乘方。 其中 式2的前缀（F除以F）就是上面的公式6不能退化的情况。为什么？因为其中可能含有因子p。因子p加入会导致乘法取模的不可逆。 需要注意的是，前缀很可能不是整数，在写代码的时候这个地方很容易犯错！所以要先进入子问题（可以用一个栈搞定）。 一般的组合数取模 有了这些，我们能干什么呢？其实，Lucas及其扩展只是把原来的组合数取模问题分割成了更小规模的问题（有lg(k)/lg(p)个）。 考虑一个一般的问题，模数m任意。 策略： 我们把m先素数分解，然后用Lucas及其扩展分割。然后对每个小问题解决合并。合并可以用CRT进行（同余方程组，中国剩余定理）。于是，如果简单的组合数取模能在O(k)的时间完成，我们就得到一个时间复杂度的算法（其中p是m的素因子，t是该素因子的个数），然后我们需要用lg级别的时间，完成每一个的合并，空间取决于素数表的大小（当然，可以没有，没有的话，就是lg级别的空间了） 可能的退化：如果p非常小，t非常大，即模数是小素数的高次。这个时候问题被退化到差不多O(k)的复杂度，k很大的情况下会很慢。但是经过测试，平均的情况非常快。 下面给出代码 CombinationNumber.cpp 包含一个比扩展lucas更稳定的版本 （很长，包括了需要用到的所有模块，同余方程组素数表什么的都在，用的时候记得先生成素数表）： PS:公式5： Wilson定理，当然这东西是什么不重要，因为都会被约掉。]]></description>
			<content:encoded><![CDATA[<p>比赛的时候，意外想到了个方法来处理组合数取模。一推，发现就是Lucas定理，并且，在模数是素数乘方的情况作了些推广。使得lucas能够处理模任意数的组合数取模。</p>
<h4>Lucas定理</h4>
<p>首先给出<strong>Lucas定理</strong>的递归描述</p>
<p><img class="aligncenter size-full wp-image-580" title="lucas" src="http://www.earthson.net/wp-content/uploads/2011/04/lucas.png" alt="lucas定理" width="540" height="82" /></p>
<p>简要<strong>证明思路</strong>：</p>
<p style="padding-left: 30px;">考虑连续的p个整数（p是素数），把能整除p的那个数除去，然后取模，再乘起来模p其实是-1(*)。注意，因为和p互素的原因，这东西是可约的。</p>
<p style="padding-left: 30px;"><img class="aligncenter size-full wp-image-586" title="productmod" src="http://www.earthson.net/wp-content/uploads/2011/04/productmod.png" alt="" width="438" height="44" /></p>
<p style="padding-left: 30px;">再考虑这个<strong>组合公式</strong></p>
<p style="padding-left: 30px;"><img class="aligncenter size-full wp-image-583" title="Combinationext" src="http://www.earthson.net/wp-content/uploads/2011/04/Combinationext.png" alt="" width="541" height="80" /></p>
<p style="padding-left: 30px;">上下都有k项，你能取的长度为p的连续整数有k/p段(从后往前取)，每一段去掉那个能被p整除的数，然后，上下因为有相同的段数，所以就被约掉了（明白为什么在这种情况下是可约的么？）。</p>
<p style="padding-left: 30px;">为什么能被p整除的数要被单独的拉出来呢？因为，和模数有公因子的数加入取模运算会导致不可逆。所以这些能被p整除的数需要被提取出来单独处理。</p>
<p style="padding-left: 30px;">于是，有了后面部分的C(n/p, k/p)，其实就是每个被提取出来的数再提取了一个因子p（因为上下提取出来的数一样多，所以，这些p自然就被约掉了）。然后，你幸运的发现，他是个组合数，于是问题被递归。最后，我们还有个前缀没有被处理。但是，因为模数是p，所以有下面公式</p>
<p style="padding-left: 30px;"><img class="aligncenter size-full wp-image-587" title="pre" src="http://www.earthson.net/wp-content/uploads/2011/04/pre.png" alt="" width="557" height="54" /></p>
<p style="padding-left: 30px;">把这写合并在一起，就有了Lucas定理的递归表述（公式1）</p>
<hr />
<h4>推广的Lucas</h4>
<p>那么要怎么处理模数是素数p的乘方的情形呢？其实是一样的，只不过，有些东西就不再退化了，比如公式6。我们可以用同样的方式，先把因子p全部提取出来单独处理，于是得到如下的公式，来处理p的乘方。</p>
<p><img class="aligncenter size-full wp-image-588" title="extLucas" src="http://www.earthson.net/wp-content/uploads/2011/04/extLucas.png" alt="" width="611" height="92" />其中</p>
<p><img class="aligncenter size-full wp-image-589" title="Finlucas" src="http://www.earthson.net/wp-content/uploads/2011/04/Finlucas.png" alt="" width="455" height="82" /></p>
<p>式2的前缀（F除以F）就是上面的公式6不能退化的情况。为什么？因为其中可能含有因子p。因子p加入会导致乘法取模的不可逆。</p>
<p><strong>需要注意的是，前缀很可能不是整数，在写代码的时候这个地方很容易犯错！所以要先进入子问题（可以用一个栈搞定）。</strong></p>
<hr />
<h4>一般的组合数取模</h4>
<p>有了这些，我们能干什么呢？<strong>其实，Lucas及其扩展只是把原来的组合数取模问题分割成了更小规模的问题（有lg(k)/lg(p)个）</strong>。</p>
<p><strong>考虑一个一般的问题，模数m任意。</strong></p>
<p><strong>策略：</strong></p>
<p style="padding-left: 30px;">我们把m先素数分解，然后用Lucas及其扩展分割。然后对每个小问题解决合并。合并可以用CRT进行（同余方程组，中国剩余定理）。于是，如果简单的组合数取模能在O(k)的时间完成，我们就得到一个<img src='http://s.wordpress.com/latex.php?latex=O%28%5Cmin%20%28k%2C%20p%5Et%20%5Ccdot%20log_p%28t%29%29%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(\min (k, p^t \cdot log_p(t)))' title='O(\min (k, p^t \cdot log_p(t)))' class='latex' />时间复杂度的算法（其中p是m的素因子，t是该素因子的个数），然后我们需要用lg级别的时间，完成每一个的合并，空间取决于素数表的大小（当然，可以没有，没有的话，就是lg级别的空间了）</p>
<p><strong><em>可能的退化：如果p非常小，t非常大，即模数是小素数的高次。这个时候问题被退化到差不多O(k)的复杂度，k很大的情况下会很慢。但是经过测试，平均的情况非常快。</em></strong></p>
<p style="padding-left: 30px;"><strong><em></em></strong>下面给出代码<br />
<a href='http://www.earthson.net/wp-content/uploads/2011/04/CombinationNumber.cpp_.zip'>CombinationNumber.cpp</a><br />
包含一个比扩展lucas更稳定的版本</p>
<p style="padding-left: 30px;"><em><strong>（很长，包括了需要用到的所有模块，同余方程组素数表什么的都在，用的时候记得先生成素数表）：<br />
</strong></em></p>
<p><em><strong>PS:公式5： Wilson定理，当然这东西是什么不重要，因为都会被约掉。</strong></em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.earthson.net/archives/577/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>素数的平方和表示</title>
		<link>http://www.earthson.net/archives/505</link>
		<comments>http://www.earthson.net/archives/505#comments</comments>
		<pubDate>Mon, 11 Apr 2011 10:33:43 +0000</pubDate>
		<dc:creator>Earthson</dc:creator>
				<category><![CDATA[Math]]></category>
		<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[数论]]></category>

		<guid isPermaLink="false">http://www.earthson.net/?p=505</guid>
		<description><![CDATA[问题： 找到这样的正整数A和B，使得 &#160; 当然，只有模4余1的素数（大于2）的才有平方和表示^^ 假设p(&#62;2)是两个数a和b平方的和，因为p是奇数，所以a和b有一个是奇数另一个是偶数。假设a=2m, b=2n+1, 则， 显然，它模4余1 现在证明以下定理，证明本身就是一个算法（费马降阶Fermat's method of descent） &#160; 首先，由二次互反律，存在整数A, B使得, 其中M是小于p的正整数 若A=1，则，所以只要我们能找到这样的B，就OK了 二次互反律说明，-1是二次剩余，所以这样的B是可以被找到的（稍后说怎么找，算法） 然后就是用费马降阶对这个初始的式子进行变换了 取u, v，使得 注意到，所以我们有 所以 把除到左边，得到 这个式子和初始的一个格式，并且有 不断重复以上步骤，M的规模每次至少减半，直到成为1，于是算法结束。此时我们也得到了p的平方和表示，并且完成了证明。 费马降阶算法的时间复杂度为O(log(M))，因为每次M的规模至少减半 PS:很漂亮的恒等式：，值得好好研究下 这样，这个定理是证明了，但是，算法却没有结束。因为初始的B还没有找到（虽然它必然存在），以下给出一个随机算法 注意到欧拉准则 所以二次非剩余的(p-1)/2次同余-1模p 因为二次非剩余有一半（在1~p-1之间），所以每次随即的选取a，我们有一半的机会获得二次非剩余 k次全部失败的概率是0.5^k，数学期望在两次左右就可找到二次非剩余 每次计算的代价是O(log(p))的 所以算法在期望O(log(p))的时间结束 &#160; PS：一些猜想：如果素数模4余1，则平方剩余成对出现，即a是平方剩余，则-a也是平方剩余。如果素数模4余3，a是平方剩余，导致-a必然不是平方剩余，即他们总是落单（这其实是显然的，否则就可以用费马降阶，构造出模4余3的素数的平方和表示了，而这是不可能的。但猜想的前半句却不是那么显然的） 上面的算法主要来自《数论概论》这本书，26章是直接对于这个问题的。]]></description>
			<content:encoded><![CDATA[<h4>问题：</h4>
<p><strong>找到这样的正整数A和B，使得<img src='http://s.wordpress.com/latex.php?latex=A%5E2%20%2B%20B%5E2%20%3D%20p&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='A^2 + B^2 = p' title='A^2 + B^2 = p' class='latex' /></strong></p>
<p>&nbsp;</p>
<p><strong>当然，只有模4余1的素数（大于2）的才有平方和表示^^</strong></p>
<p style="padding-left: 30px;">假设p(&gt;2)是两个数a和b平方的和，因为p是奇数，所以a和b有一个是奇数另一个是偶数。假设a=2m, b=2n+1, 则<img src='http://s.wordpress.com/latex.php?latex=a%5E2%20%2B%20b%20%5E2%20%3D%204m%5E2%2B%204n%5E2%20%2B%204n%20%2B%201&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='a^2 + b ^2 = 4m^2+ 4n^2 + 4n + 1' title='a^2 + b ^2 = 4m^2+ 4n^2 + 4n + 1' class='latex' />， 显然，它模4余1</p>
<hr />
<p>现在证明以下定理，证明本身就是一个算法（费马降阶Fermat's method of descent）</p>
<p style="padding-left: 60px;"><img src='http://s.wordpress.com/latex.php?latex=For%20%5C%3B%20p%20%5C%3B%20is%20%5C%3B%20prime%20%5C%3B%20more%20%5C%3B%20than%20%5C%3B%202%3A%20%5C%3B%20p%20%5Cequiv%201%20%5Cmod%204%20%5CLeftrightarrow%20%5Cexists%20a%2C%20b%20%5Cin%20N%5E%2A%2C%20p%20%3D%20a%5E2%20%2B%20b%5E2&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='For \; p \; is \; prime \; more \; than \; 2: \; p \equiv 1 \mod 4 \Leftrightarrow \exists a, b \in N^*, p = a^2 + b^2' title='For \; p \; is \; prime \; more \; than \; 2: \; p \equiv 1 \mod 4 \Leftrightarrow \exists a, b \in N^*, p = a^2 + b^2' class='latex' /></p>
<p>&nbsp;</p>
<ul>
<li>首先，由二次互反律，存在整数A, B使得<img src='http://s.wordpress.com/latex.php?latex=A%5E2%20%2B%20B%5E2%20%3D%20Mp&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='A^2 + B^2 = Mp' title='A^2 + B^2 = Mp' class='latex' />, 其中M是小于p的正整数</li>
</ul>
<p style="padding-left: 60px;"><em><strong>若A=1，则<img src='http://s.wordpress.com/latex.php?latex=B%5E2%20%5Cequiv%20-1%20%5Cmod%20p&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='B^2 \equiv -1 \mod p' title='B^2 \equiv -1 \mod p' class='latex' />，所以只要我们能找到这样的B，就OK了</strong></em></p>
<p style="padding-left: 60px;"><em><strong>二次互反律说明，-1是二次剩余，所以这样的B是可以被找到的（稍后说怎么找，算法）</strong></em></p>
<p style="padding-left: 60px;"><em><strong><br />
</strong></em></p>
<ul>
<li>然后就是用费马降阶对这个初始的式子进行变换了
<ol>
<li><strong>取u, v，使得<img src='http://s.wordpress.com/latex.php?latex=u%20%5Cequiv%20A%20%28%5Cmod%20M%29%2C%20v%20%5Cequiv%20B%20%28%5Cmod%20M%29%2C%20-%5Cfrac%7BM%7D%7B2%7D%20%5Cleqslant%20u%2C%20v%20%5Cleqslant%20%5Cfrac%7BM%7D%7B2%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='u \equiv A (\mod M), v \equiv B (\mod M), -\frac{M}{2} \leqslant u, v \leqslant \frac{M}{2}' title='u \equiv A (\mod M), v \equiv B (\mod M), -\frac{M}{2} \leqslant u, v \leqslant \frac{M}{2}' class='latex' /></strong></li>
<li><strong>注意到<img src='http://s.wordpress.com/latex.php?latex=u%5E2%20%2B%20v%5E2%20%5Cequiv%20A%5E2%20%2B%20B%5E2%20%5Cequiv%200%20%5C%3B%20%28%5Cmod%20M%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='u^2 + v^2 \equiv A^2 + B^2 \equiv 0 \; (\mod M)' title='u^2 + v^2 \equiv A^2 + B^2 \equiv 0 \; (\mod M)' class='latex' />，所以我们有<img src='http://s.wordpress.com/latex.php?latex=u%5E2%20%2B%20v%5E2%20%3D%20Mr%5C%3B%281%20%5Cleqslant%20r%20%3C%20M%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='u^2 + v^2 = Mr\;(1 \leqslant r &lt; M)' title='u^2 + v^2 = Mr\;(1 \leqslant r &lt; M)' class='latex' /></strong></li>
<li><strong>所以<img src='http://s.wordpress.com/latex.php?latex=%28uA%2BvB%29%5E2%2B%28vA-uB%29%5E2%3D%28u%5E2%2Bv%5E2%29%28A%5E2%2BB%5E2%29%3DM%5E2%20rp&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='(uA+vB)^2+(vA-uB)^2=(u^2+v^2)(A^2+B^2)=M^2 rp' title='(uA+vB)^2+(vA-uB)^2=(u^2+v^2)(A^2+B^2)=M^2 rp' class='latex' /></strong></li>
<li><strong>把<img src='http://s.wordpress.com/latex.php?latex=M%5E2&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='M^2' title='M^2' class='latex' />除到左边，得到<img src='http://s.wordpress.com/latex.php?latex=%28%5Cfrac%7BuA%2BvB%7D%7BM%7D%29%5E2%2B%28%5Cfrac%7BvA-uB%7D%7BM%7D%29%5E2%3Drp&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='(\frac{uA+vB}{M})^2+(\frac{vA-uB}{M})^2=rp' title='(\frac{uA+vB}{M})^2+(\frac{vA-uB}{M})^2=rp' class='latex' /></strong></li>
<li><strong>这个式子和初始的<img src='http://s.wordpress.com/latex.php?latex=A%5E2%20%2B%20B%5E2%20%3D%20Mp&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='A^2 + B^2 = Mp' title='A^2 + B^2 = Mp' class='latex' />一个格式，并且有<img src='http://s.wordpress.com/latex.php?latex=r%20%5Cleqslant%20%5Cfrac%7BM%7D%7B2%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='r \leqslant \frac{M}{2}' title='r \leqslant \frac{M}{2}' class='latex' /></strong></li>
<li><strong>不断重复以上步骤，M的规模每次至少减半，直到成为1，于是算法结束。此时我们也得到了p的平方和表示，并且完成了证明。</strong></li>
<li><strong>费马降阶算法的时间复杂度为O(log(M))，因为每次M的规模至少减半</strong></li>
</ol>
</li>
</ul>
<p style="padding-left: 90px;"><strong>PS:很漂亮的恒等式：<img src='http://s.wordpress.com/latex.php?latex=%28uA%2BvB%29%5E2%2B%28vA-uB%29%5E2%3D%28u%5E2%2Bv%5E2%29%28A%5E2%2BB%5E2%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='(uA+vB)^2+(vA-uB)^2=(u^2+v^2)(A^2+B^2)' title='(uA+vB)^2+(vA-uB)^2=(u^2+v^2)(A^2+B^2)' class='latex' />，值得好好研究下</strong></p>
<ul>
<li>这样，这个定理是证明了，但是，算法却没有结束。因为初始的B还没有找到（虽然它必然存在），以下给出一个随机算法
<ol>
<li><strong>注意到欧拉准则<img src='http://s.wordpress.com/latex.php?latex=a%5E%7B%5Cfrac%7Bp-1%7D%7B2%7D%7D%20%5Cequiv%20%28%5Cfrac%7Ba%7D%7Bp%7D%29%28%20%5Cmod%20p%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='a^{\frac{p-1}{2}} \equiv (\frac{a}{p})( \mod p)' title='a^{\frac{p-1}{2}} \equiv (\frac{a}{p})( \mod p)' class='latex' /></strong></li>
<li><strong>所以二次非剩余的(p-1)/2次同余-1模p</strong></li>
<li><strong>因为二次非剩余有一半（在1~p-1之间），所以每次随即的选取a，我们有一半的机会获得二次非剩余</strong></li>
<li><strong>k次全部失败的概率是0.5^k，数学期望在两次左右就可找到二次非剩余</strong></li>
<li><strong>每次计算<img src='http://s.wordpress.com/latex.php?latex=a%5E%7B%5Cfrac%7Bp-1%7D%7B2%7D%7D%20%5Cmod%20p&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='a^{\frac{p-1}{2}} \mod p' title='a^{\frac{p-1}{2}} \mod p' class='latex' />的代价是O(log(p))的</strong></li>
<li><strong>所以算法在期望O(log(p))的时间结束</strong></li>
</ol>
</li>
</ul>
<p>&nbsp;</p>
<p><strong>PS：一些猜想：如果素数模4余1，则平方剩余成对出现，即a是平方剩余，则-a也是平方剩余。如果素数模4余3，a是平方剩余，导致-a必然不是平方剩余，即他们总是落单（这其实是显然的，否则就可以用费马降阶，构造出模4余3的素数的平方和表示了，而这是不可能的。但猜想的前半句却不是那么显然的）<br />
</strong></p>
<p>上面的算法主要来自《数论概论》这本书，26章是直接对于这个问题的。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.earthson.net/archives/505/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>基于二进制的递推</title>
		<link>http://www.earthson.net/archives/491</link>
		<comments>http://www.earthson.net/archives/491#comments</comments>
		<pubDate>Tue, 15 Mar 2011 12:27:24 +0000</pubDate>
		<dc:creator>Earthson</dc:creator>
				<category><![CDATA[ACM]]></category>
		<category><![CDATA[Math]]></category>

		<guid isPermaLink="false">http://www.earthson.net/?p=491</guid>
		<description><![CDATA[快半年没更新了，囧。。 把去年的某类结果整理了下，总结如下： 我们都习惯了前后项的逐项递推策略，这类一般的策略，可以称之为线性方式。下面，我说一种当序列满足某些性质是能狗构造的平方递推模式(基于项的二进制表示) 序列需要满足的性质 ***我们假设序列为a[1], a[2], a[3], a[4], a[5], ..., a[n]，以下所说的“简单”，意思是计算时间代价低于线性 a[n] -> a[2n]是简单的（n是2的幂） a[n], a[m] -> a[n + m]是简单的（n是2的幂，且m小于n） 当然，有一个更强的性质会使问题简化（它是上面条件的充分条件，但不是必要的） a[n], a[m] -> a[n + m]是简单的（m, n为任意正整数） 算法构造 首先考虑到因为性质1，所以，在已知a[1]推a[n]是非常简单的（其中n是2的幂）。 其次，假设我们已经知道a[1]~a[n-1]的所有值，依赖性质2，我们可以轻易的把这些和a[n]合并，然后得到a[n + m]的值。于是，我们获得了a[1]~a[2n - 1]的所有值。 注意到我们有a[1]所以，我们能对整个序列产生一个覆盖。 接下去我们构造算法，来求特定的位置的a[p] 假设p = n + m，n是不大于p的最大的2的幂，我们要做的只是求a[n]和a[m]。m大小的子问题和p大小的问题只在规模上存在不同。问题很快被递归到二进制低位 现在我们倒过来，你懂的。按照二进制展开逐位往高位递推（而且，我们在递推过程中逐位生成了a[n]，n是二的幂，真是一举两得）。 再给张图片，方便大家理解，推导规模为1101的情况 时间效率分析 这个还是依赖于合并和地推的效率的，如果性质1和2的效率是O(1)的，那么，最终效率就是O(lgn)，这个效率已经达到了信息量上的线性，单从界的角度已经是最好的了。 实例 逐次平方求幂，移位乘法，等比前n项和等各种都可以用这种方法构造，效率就不用多说了，时间O(lgn)，空间O(1)]]></description>
			<content:encoded><![CDATA[<p>快半年没更新了，囧。。</p>
<p>把去年的某类结果整理了下，总结如下：</p>
<p>我们都习惯了前后项的逐项递推策略，这类一般的策略，可以称之为线性方式。下面，我说一种当序列满足某些性质是能狗构造的平方递推模式(基于项的二进制表示)</p>
<hr />
<h4>序列需要满足的性质</h4>
<p>***我们假设序列为a[1], a[2], a[3], a[4], a[5], ..., a[n]，以下所说的“简单”，意思是计算时间代价低于线性</p>
<ol>
<li>a[n] -> a[2n]是简单的（n是2的幂）</li>
<li>a[n], a[m] -> a[n + m]是简单的（n是2的幂，且m小于n）</li>
</ol>
<p>当然，有一个更强的性质会使问题简化（它是上面条件的充分条件，但不是必要的）</p>
<p><b>a[n], a[m] -> a[n + m]是简单的（m, n为任意正整数）</b></p>
<hr />
<h4>算法构造</h4>
<p>
首先考虑到因为性质1，所以，在已知a[1]推a[n]是非常简单的（其中n是2的幂）。<br />
其次，假设我们已经知道a[1]~a[n-1]的所有值，依赖性质2，我们可以轻易的把这些和a[n]合并，然后得到a[n + m]的值。于是，我们获得了a[1]~a[2n - 1]的所有值。<br />
注意到我们有a[1]所以，我们能对整个序列产生一个覆盖。
</p>
<p>接下去我们构造算法，来求特定的位置的a[p]</p>
<ol>
<li>假设p = n + m，n是不大于p的最大的2的幂，我们要做的只是求a[n]和a[m]。m大小的子问题和p大小的问题只在规模上存在不同。问题很快被递归到二进制低位</li>
<li>现在我们倒过来，你懂的。按照二进制展开逐位往高位递推（而且，我们在递推过程中逐位生成了a[n]，n是二的幂，真是一举两得）。</li>
</ol>
<p>再给张图片，方便大家理解，推导规模为1101的情况</p>
<p><img src="http://www.earthson.net/wp-content/uploads/2011/03/BinaryRecurrence.png" alt="recurrence" title="BinaryRecurrence" width="783" height="296" class="aligncenter size-full wp-image-503" /></p>
<hr />
<h4>时间效率分析</h4>
<p>这个还是依赖于合并和地推的效率的，如果性质1和2的效率是O(1)的，那么，最终效率就是O(lgn)，这个效率已经达到了信息量上的线性，单从界的角度已经是最好的了。</p>
<hr />
<h4>实例</h4>
<p><a href="http://www.earthson.net/archives/276" target="_blank">逐次平方求幂</a>，移位乘法，<a href="http://www.earthson.net/archives/280" target="_blank">等比前n项和</a>等各种都可以用这种方法构造，效率就不用多说了，时间O(lgn)，空间O(1)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.earthson.net/archives/491/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>组合数取模总结</title>
		<link>http://www.earthson.net/archives/448</link>
		<comments>http://www.earthson.net/archives/448#comments</comments>
		<pubDate>Mon, 25 Oct 2010 12:26:40 +0000</pubDate>
		<dc:creator>Earthson</dc:creator>
				<category><![CDATA[ACM]]></category>
		<category><![CDATA[Math]]></category>
		<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[数论]]></category>
		<category><![CDATA[组合]]></category>

		<guid isPermaLink="false">http://www.earthson.net/?p=448</guid>
		<description><![CDATA[组合数取模，其实实际用途不大。。好吧，acm老喜欢出这样的题目，因为数据可能很大。。 以下给出第一个约分版本的组合数取模，能够处理当C(n,m) mod s当m不是很大的情况，有很多优化，先给代码吧^^ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 int combination_Mod_m &#40;int a, int b, int m&#41; &#123; const int gate = 2000000000; ///larger gate for more Optimization if &#40;b &#62; a&#41; [...]]]></description>
			<content:encoded><![CDATA[<p>组合数取模，其实实际用途不大。。好吧，acm老喜欢出这样的题目，因为数据可能很大。。</p>
<p>以下给出第一个约分版本的组合数取模，能够处理当C(n,m) mod s当m不是很大的情况，有很多优化，先给代码吧^^</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> combination_Mod_m <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> a, <span style="color: #0000ff;">int</span> b, <span style="color: #0000ff;">int</span> m<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> gate <span style="color: #000080;">=</span> <span style="color: #0000dd;">2000000000</span><span style="color: #008080;">;</span>  <span style="color: #666666;">///larger gate for more Optimization</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>b <span style="color: #000080;">&gt;</span> a<span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
    b <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>a <span style="color: #000040;">-</span> b <span style="color: #000080;">&lt;</span> b<span style="color: #008000;">&#41;</span> <span style="color: #008080;">?</span> a <span style="color: #000040;">-</span> b <span style="color: #008080;">:</span> b<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">int</span> d<span style="color: #008000;">&#91;</span>b<span style="color: #008000;">&#93;</span>, tmp <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span> ,l <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span>, h, j, g<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>l <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span>, j <span style="color: #000080;">=</span> a <span style="color: #000040;">-</span> b <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span> a <span style="color: #000040;">-</span> l <span style="color: #000080;">&gt;=</span> j<span style="color: #008080;">;</span> l<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
		d<span style="color: #008000;">&#91;</span>l<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> a <span style="color: #000040;">-</span> l<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>gate <span style="color: #000040;">/</span> d<span style="color: #008000;">&#91;</span>l<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&gt;=</span> j <span style="color: #000040;">&amp;&amp;</span> a <span style="color: #000040;">-</span> l <span style="color: #000040;">!</span><span style="color: #000080;">=</span> j<span style="color: #008000;">&#41;</span>
			d<span style="color: #008000;">&#91;</span>l<span style="color: #008000;">&#93;</span> <span style="color: #000040;">*</span><span style="color: #000080;">=</span> j, j<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>j <span style="color: #000080;">=</span> <span style="color: #0000dd;">2</span>, h <span style="color: #000080;">=</span> b<span style="color: #008080;">;</span> j <span style="color: #000080;">&lt;=</span> h<span style="color: #008080;">;</span> h<span style="color: #000040;">--</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
    	tmp <span style="color: #000040;">*</span><span style="color: #000080;">=</span> h<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>gate <span style="color: #000040;">/</span> tmp <span style="color: #000080;">&gt;=</span> j <span style="color: #000040;">&amp;&amp;</span> h <span style="color: #000040;">!</span><span style="color: #000080;">=</span> j<span style="color: #008000;">&#41;</span>
        	tmp <span style="color: #000040;">*</span><span style="color: #000080;">=</span> j, j<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> tmp <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            g <span style="color: #000080;">=</span> gcd <span style="color: #008000;">&#40;</span>tmp, d<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            d<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">/</span><span style="color: #000080;">=</span> g, tmp <span style="color: #000040;">/</span><span style="color: #000080;">=</span> g<span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">int</span> result <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> l<span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
        d<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">%</span><span style="color: #000080;">=</span> m, result <span style="color: #000040;">*</span><span style="color: #000080;">=</span> d<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>, result <span style="color: #000040;">%</span><span style="color: #000080;">=</span> m<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> result<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>思路很直接——约分，基于这个公式<img src='http://s.wordpress.com/latex.php?latex=%28%5En%20_m%29%20%3D%20%5Cfrac%7Bn%20%5Ccdot%20%28n-1%29%20%5Ccdots%20%28n-m%2B1%29%7D%7B1%20%5Ccdot%202%20%5Ccdot%20%28m-1%29%5Ccdots%20m%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='(^n _m) = \frac{n \cdot (n-1) \cdots (n-m+1)}{1 \cdot 2 \cdot (m-1)\cdots m}' title='(^n _m) = \frac{n \cdot (n-1) \cdots (n-m+1)}{1 \cdot 2 \cdot (m-1)\cdots m}' class='latex' />，直接吧分子全部保存在一个数组里，然后用下面的数不断gcd，约去公因子，直到去约的数成为1，即下面所有的数都成为1。注意我加了一个优化——把分子和分母尽可能合并，以减少gcd运行的次数，这是一种贪心的策略。</p>
<p style="font-weight:bold">基于以下的问题:给定若干容器，每个里面存放了一个数，每个有一个容量的上限。规定一次合并操作——把两个容器合并为一个，但是其中保存的数为两个数的乘积。求若干合并之后，容器总数最少。</p>
<p>策略：先排序，然后从最大的数开始，找最小的数和它乘，看有没有溢出，没有就合并这两个数，并且“删掉”最小的，用新的最小的数重复刚才的过程（和选定的那个大的数相乘），否则取次大的，不断进行这个过程，直到到达序列末。不难证明它是最优的。基于这个优化，在m不是很大的时候（一般不超过100），这个算法是接近线性(O(m))的，<a href="http://acm.jlu.edu.cn/joj/showproblem.php?pid=2606" target="_blank">joj 2606</a>就是这么被我优化到0.00s的^^<br />
<hr /></p>
<p>第二个版本，使用素数分解约分，这个版本很快，估计应该是亚线性的，但它不能处理n非常大的情况，一般能够处理n在最大1000000左右的情况，并且需要用到<a href="http://www.earthson.net/archives/432" target="_blank">素数表</a>。基于以下公式：<img src='http://s.wordpress.com/latex.php?latex=%28%5En%20_m%29%20%3D%20%5Cfrac%7Bn%21%7D%7Bm%21%5Ccdot%28n-m%29%21%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='(^n _m) = \frac{n!}{m!\cdot(n-m)!}' title='(^n _m) = \frac{n!}{m!\cdot(n-m)!}' class='latex' />，先贴代码^^</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">///need prime table,and n &lt; N</span>
<span style="color: #0000ff;">int</span> combination_Mod_h <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> n, <span style="color: #0000ff;">int</span> m, <span style="color: #0000ff;">int</span> h<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>h <span style="color: #000080;">==</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">int</span> result <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span>, cnt <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span>, temp<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> prime<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span> <span style="color: #000040;">&amp;&amp;</span> prime<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&lt;=</span> n<span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		temp <span style="color: #000080;">=</span> n, cnt <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>temp<span style="color: #008000;">&#41;</span>
			temp <span style="color: #000040;">/</span><span style="color: #000080;">=</span> prime<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>, cnt <span style="color: #000040;">+</span><span style="color: #000080;">=</span> temp<span style="color: #008080;">;</span>
		temp <span style="color: #000080;">=</span> n <span style="color: #000040;">-</span> m<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>temp<span style="color: #008000;">&#41;</span>
			temp <span style="color: #000040;">/</span><span style="color: #000080;">=</span> prime<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>, cnt <span style="color: #000040;">-</span><span style="color: #000080;">=</span> temp<span style="color: #008080;">;</span>
		temp <span style="color: #000080;">=</span> m<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>temp<span style="color: #008000;">&#41;</span>
			temp <span style="color: #000040;">/</span><span style="color: #000080;">=</span> prime<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>, cnt <span style="color: #000040;">-</span><span style="color: #000080;">=</span> temp<span style="color: #008080;">;</span>
		temp <span style="color: #000080;">=</span> prime<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>cnt<span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>cnt <span style="color: #000040;">&amp;</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span>
                                result <span style="color: #000040;">*</span><span style="color: #000080;">=</span> temp, result <span style="color: #000040;">%</span><span style="color: #000080;">=</span> h<span style="color: #008080;">;</span>
			temp <span style="color: #000040;">*</span><span style="color: #000080;">=</span> temp, cnt <span style="color: #000080;">&gt;&gt;=</span> <span style="color: #0000dd;">1</span>, temp <span style="color: #000040;">%</span><span style="color: #000080;">=</span> h<span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>result <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">return</span> result<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>这个基本没啥好说的，都比较直接，有一点要提一下：m!中素因子p的数目，求法:m不断除p，除的结果不断加到一个变量保存，当m为0的时候，那个保存的结果即所求（第9,12,15行都是这个过程），如果你大脑能作一个数域的映射的话，这个是显然的，当然你也可以技巧性的通过公式变形得到，具体就不解释了^^<br />
<hr /></p>
<p>接下去介绍一个线性O(m)的方法，简单的说，就是把模数分解，然后同余方程组合并，这里给出模素数p的情况和模素数的乘方<img src='http://s.wordpress.com/latex.php?latex=p%5Ek&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='p^k' title='p^k' class='latex' />的情况</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">///O(m) p is prime number, p*p &lt; INT_MAX</span>
<span style="color: #0000ff;">int</span> combination_Mod_p <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> n, <span style="color: #0000ff;">int</span> m, <span style="color: #0000ff;">int</span> p<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>m <span style="color: #000080;">&gt;</span> n<span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
    m <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>n <span style="color: #000040;">-</span> m <span style="color: #000080;">&lt;</span> m<span style="color: #008000;">&#41;</span> <span style="color: #008080;">?</span> n <span style="color: #000040;">-</span> m <span style="color: #008080;">:</span> m<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">int</span> a <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span>, b <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span>, x, y, pcnt <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;=</span> m<span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        a <span style="color: #000040;">*</span><span style="color: #000080;">=</span> n <span style="color: #000040;">-</span> i <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span>, b <span style="color: #000040;">*</span><span style="color: #000080;">=</span> i<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>a <span style="color: #000040;">%</span> p <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> a <span style="color: #000040;">/</span><span style="color: #000080;">=</span> p, pcnt<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>b <span style="color: #000040;">%</span> p <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> b <span style="color: #000040;">/</span><span style="color: #000080;">=</span> p, pcnt<span style="color: #000040;">--</span><span style="color: #008080;">;</span>
        b <span style="color: #000040;">%</span><span style="color: #000080;">=</span> p, a <span style="color: #000040;">%</span><span style="color: #000080;">=</span> p<span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>pcnt<span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
    extended_gcd<span style="color: #008000;">&#40;</span>b, p, x, y<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>x <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> x <span style="color: #000040;">+</span><span style="color: #000080;">=</span> p<span style="color: #008080;">;</span>
    x <span style="color: #000040;">*</span><span style="color: #000080;">=</span> a, x <span style="color: #000040;">%</span><span style="color: #000080;">=</span> p<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> x<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #666666;">///O(m)</span>
<span style="color: #666666;">///p is prime and p^k &lt; INT_MAX</span>
<span style="color: #0000ff;">int</span> combination_Mod_pk <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> n, <span style="color: #0000ff;">int</span> m, <span style="color: #0000ff;">int</span> p, <span style="color: #0000ff;">int</span> k<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>m <span style="color: #000080;">&gt;</span> n<span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
    m <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>n <span style="color: #000040;">-</span> m <span style="color: #000080;">&lt;</span> m<span style="color: #008000;">&#41;</span> <span style="color: #008080;">?</span> n <span style="color: #000040;">-</span> m <span style="color: #008080;">:</span> m<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">int</span> a <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span>, b <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span>, x, y, pa <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span>, pb <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span>, pcnt <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">int</span> q <span style="color: #000080;">=</span> power<span style="color: #008000;">&#40;</span>p, k<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;=</span> m<span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        a <span style="color: #000040;">*</span><span style="color: #000080;">=</span> n <span style="color: #000040;">-</span> i <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span>, b <span style="color: #000040;">*</span><span style="color: #000080;">=</span> i<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>a <span style="color: #000040;">%</span> p <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> pa <span style="color: #000040;">*</span><span style="color: #000080;">=</span> p, a <span style="color: #000040;">/</span><span style="color: #000080;">=</span> p<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>b <span style="color: #000040;">%</span> p <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> pb <span style="color: #000040;">*</span><span style="color: #000080;">=</span> p, b <span style="color: #000040;">/</span><span style="color: #000080;">=</span> p<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>pa <span style="color: #000040;">%</span> q <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> pa <span style="color: #000040;">/</span><span style="color: #000080;">=</span> q, pcnt<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>pb <span style="color: #000040;">%</span> q <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> pb <span style="color: #000040;">/</span><span style="color: #000080;">=</span> q, pcnt<span style="color: #000040;">--</span><span style="color: #008080;">;</span>
        b <span style="color: #000040;">%</span><span style="color: #000080;">=</span> q, a <span style="color: #000040;">%</span><span style="color: #000080;">=</span> q<span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>pa <span style="color: #000080;">&lt;</span> pb<span style="color: #008000;">&#41;</span> pcnt<span style="color: #000040;">--</span>, pa <span style="color: #000040;">*</span><span style="color: #000080;">=</span> q<span style="color: #008080;">;</span>
    pa <span style="color: #000040;">/</span><span style="color: #000080;">=</span> pb, a <span style="color: #000040;">*</span><span style="color: #000080;">=</span> pa, a <span style="color: #000040;">%</span><span style="color: #000080;">=</span> q<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>pcnt<span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
    extended_gcd<span style="color: #008000;">&#40;</span>b, q, x, y<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>x <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> x <span style="color: #000040;">+</span><span style="color: #000080;">=</span> q<span style="color: #008080;">;</span>
    x <span style="color: #000040;">*</span><span style="color: #000080;">=</span> a, x <span style="color: #000040;">%</span><span style="color: #000080;">=</span> q<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> x<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #ff0000; font-style: italic;">/**
  * Extended Euclid's Algorithm
  * ax+by=gcd(a,b);
  **/</span>
<span style="color: #0000ff;">int</span> extended_gcd <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> a, <span style="color: #0000ff;">int</span> b, <span style="color: #0000ff;">int</span> <span style="color: #000040;">&amp;</span>x, <span style="color: #0000ff;">int</span> <span style="color: #000040;">&amp;</span>y<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>b<span style="color: #008000;">&#41;</span>
        <span style="color: #0000ff;">return</span> x <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span>, y <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span>, a<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">int</span> ret <span style="color: #000080;">=</span> extended_gcd <span style="color: #008000;">&#40;</span>b, a <span style="color: #000040;">%</span> b, x, y<span style="color: #008000;">&#41;</span>, tmp <span style="color: #000080;">=</span> x<span style="color: #008080;">;</span>
    x <span style="color: #000080;">=</span> y, y <span style="color: #000080;">=</span> tmp <span style="color: #000040;">-</span> <span style="color: #008000;">&#40;</span>a <span style="color: #000040;">/</span> b<span style="color: #008000;">&#41;</span> <span style="color: #000040;">*</span> y<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> ret<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">int</span> power <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> x, <span style="color: #0000ff;">int</span> k<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">int</span> result <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>k<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>k <span style="color: #000040;">&amp;</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span>
            result <span style="color: #000040;">*</span><span style="color: #000080;">=</span> x<span style="color: #008080;">;</span>
        x <span style="color: #000040;">*</span><span style="color: #000080;">=</span> x, k <span style="color: #000080;">&gt;&gt;=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">return</span> result<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>这个原理不难，就是分子分母分别对p取模，然后求逆。。当然，需要注意可能的退化情况。<br />假设分母为b，分子是a，则最后需要求<img src='http://s.wordpress.com/latex.php?latex=a%20%5Cequiv%20b%20%5Ccdot%20x%5C%2C%20%28mod%20%5C%2C%20p%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='a \equiv b \cdot x\, (mod \, p)' title='a \equiv b \cdot x\, (mod \, p)' class='latex' />的x值。<br />
注意，如果b和p有大于1的公因子，会有多解，这个就是退化情况，所有在过程中需要不断抽取b中p的因子，抽取之后再不断取模，这样就可以了。<br />当然，因为a中相应的要约去b中被抽取的因子(这些都被一些临时变量保存)，所以a也要抽取p的因子（需要注意的是，乘了再约和约了再乘是不一样的，前者会导致失真）<br />
<hr /></p>
<p>当然，上面是通过同余方程组，不用同余方程组的话，可以得到一个m*lgn的算法，不断抽取模数m的因子^^，也给出代码吧，因为没有同余方程组，实现稍简单一些，如果要求不是太高，也可以用</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">/// s*s &lt; INT_MAX , and s can be any positive number</span>
<span style="color: #0000ff;">int</span> combination_Mod_s <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> n, <span style="color: #0000ff;">int</span> m, <span style="color: #0000ff;">int</span> s<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>m <span style="color: #000080;">&gt;</span> n<span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
    m <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>n <span style="color: #000040;">-</span> m <span style="color: #000080;">&lt;</span> m<span style="color: #008000;">&#41;</span> <span style="color: #008080;">?</span> n <span style="color: #000040;">-</span> m <span style="color: #008080;">:</span> m<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">int</span> a <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span>, b <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span>, x, y, g, pcnt <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">int</span> pa <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span>, pb <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span> <span style="color: #666666;">///To be sure that pa and pb is not overflow</span>
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;=</span> m<span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        a <span style="color: #000040;">*</span><span style="color: #000080;">=</span> n <span style="color: #000040;">-</span> i <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span>, b <span style="color: #000040;">*</span><span style="color: #000080;">=</span> i<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span> <span style="color: #008000;">&#40;</span>g <span style="color: #000080;">=</span> gcd<span style="color: #008000;">&#40;</span>a, s<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&gt;</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> pa <span style="color: #000040;">*</span><span style="color: #000080;">=</span> g, a <span style="color: #000040;">/</span><span style="color: #000080;">=</span> g<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span> <span style="color: #008000;">&#40;</span>g <span style="color: #000080;">=</span> gcd<span style="color: #008000;">&#40;</span>b, s<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&gt;</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> pb <span style="color: #000040;">*</span><span style="color: #000080;">=</span> g, b <span style="color: #000040;">/</span><span style="color: #000080;">=</span> g<span style="color: #008080;">;</span>
        g <span style="color: #000080;">=</span> gcd<span style="color: #008000;">&#40;</span>pa, pb<span style="color: #008000;">&#41;</span>, pa <span style="color: #000040;">/</span><span style="color: #000080;">=</span> g, pb <span style="color: #000040;">/</span><span style="color: #000080;">=</span> g<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>pa <span style="color: #000040;">%</span> s <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> pa <span style="color: #000040;">/</span><span style="color: #000080;">=</span> s, pcnt<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>pb <span style="color: #000040;">%</span> s <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> pb <span style="color: #000040;">/</span><span style="color: #000080;">=</span> s, pcnt<span style="color: #000040;">--</span><span style="color: #008080;">;</span>
        b <span style="color: #000040;">%</span><span style="color: #000080;">=</span> s, a <span style="color: #000040;">%</span><span style="color: #000080;">=</span> s<span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>pcnt<span style="color: #008000;">&#41;</span> pcnt<span style="color: #000040;">--</span>, pa <span style="color: #000040;">*</span><span style="color: #000080;">=</span> s<span style="color: #008080;">;</span>
    pa <span style="color: #000040;">/</span><span style="color: #000080;">=</span> pb, pa <span style="color: #000040;">%</span><span style="color: #000080;">=</span> s, a <span style="color: #000040;">*</span><span style="color: #000080;">=</span> pa, a <span style="color: #000040;">%</span><span style="color: #000080;">=</span> s<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>pcnt<span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
    extended_gcd<span style="color: #008000;">&#40;</span>b, s, x, y<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>x <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> x <span style="color: #000040;">+</span><span style="color: #000080;">=</span> s<span style="color: #008080;">;</span>
    x <span style="color: #000040;">*</span><span style="color: #000080;">=</span> a, x <span style="color: #000040;">%</span><span style="color: #000080;">=</span> s<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> x<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<hr />
<p>最后，是一个我还没完全参透的定理：Lucas定理，具体可以参看wiki，目前还不太清楚能不能处理p的乘方（要是能就好了^^），慢慢研究吧</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #ff0000; font-style: italic;">/**
  * Lucas' theorem---combination number mod prime p
  * Be sure that p*p&lt;INT_MAX
  **/</span>
<span style="color: #0000ff;">int</span> lucas <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> m, <span style="color: #0000ff;">int</span> n, <span style="color: #0000ff;">int</span> p<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">int</span> result <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>m <span style="color: #000040;">&amp;&amp;</span> n <span style="color: #000040;">&amp;&amp;</span> result<span style="color: #008000;">&#41;</span>
        result <span style="color: #000040;">*</span><span style="color: #000080;">=</span> combination_Mod_p <span style="color: #008000;">&#40;</span>m <span style="color: #000040;">%</span> p, n <span style="color: #000040;">%</span> p, p<span style="color: #008000;">&#41;</span>, result <span style="color: #000040;">%</span><span style="color: #000080;">=</span> p, m <span style="color: #000040;">/</span><span style="color: #000080;">=</span> p, n <span style="color: #000040;">/</span><span style="color: #000080;">=</span> p<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> result<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.earthson.net/archives/448/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>素数筛法 Sieve Method</title>
		<link>http://www.earthson.net/archives/432</link>
		<comments>http://www.earthson.net/archives/432#comments</comments>
		<pubDate>Tue, 28 Sep 2010 07:35:18 +0000</pubDate>
		<dc:creator>Earthson</dc:creator>
				<category><![CDATA[ACM]]></category>
		<category><![CDATA[Math]]></category>
		<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[数论]]></category>

		<guid isPermaLink="false">http://www.earthson.net/?p=432</guid>
		<description><![CDATA[前段时间学会了一个线性筛法，这个算法居然是O(n)的，确实令人震惊。而且更棒的是，它还为处理基于素因子分解的积性函数，提供了线性的筛法 先贴一下代码吧^^ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 const int N=100000; int prime&#91;N+1&#93;; int get_prime&#40;&#41; ///get primes from 1 to N in liner time &#123; memset&#40;prime,0,sizeof&#40;int&#41;*&#40;N+1&#41;&#41;; for&#40;int i=2;i&#60;=N;i++&#41; &#123; if&#40;!prime&#91;i&#93;&#41; prime&#91;++prime&#91;0&#93;&#93;=i; for&#40;int j=1;prime&#91;j&#93;&#60;=N/i;j++&#41; &#123; prime&#91;prime&#91;j&#93;*i&#93;=1; if&#40;i%prime&#91;j&#93;==0&#41; break; &#125; &#125; return prime&#91;0&#93;; &#125; 算法的思路是这样的：总是使用能整除合数的最小素因子，筛去合数。注意第12行，这句话保证i不被任何比prime[j]小的素数整除，对于i*prime[j]（这个j包括比当前条件成立的j更小的j），它的最小素因子显然就是prime[j]。注意，筛去合数的，总是该合数的最小素因子和与之对应的另一个因子i，所以它只会被筛一次^^ 类似的可以得到很多积性以及“和性”的函数值，比如欧拉phi函数，sigma函数（n的所有因数和），还有n的所有因子的个数，等等等等。。。 17 [...]]]></description>
			<content:encoded><![CDATA[<p>前段时间学会了一个线性筛法，这个算法居然是O(n)的，确实令人震惊。而且更棒的是，它还为处理基于素因子分解的积性函数，提供了线性的筛法</p>
<p>先贴一下代码吧^^</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> N<span style="color: #000080;">=</span><span style="color: #0000dd;">100000</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> prime<span style="color: #008000;">&#91;</span>N<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> get_prime<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">///get primes from 1 to N in liner time</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000dd;">memset</span><span style="color: #008000;">&#40;</span>prime,<span style="color: #0000dd;">0</span>,<span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">*</span><span style="color: #008000;">&#40;</span>N<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #0000dd;">2</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>N<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>prime<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> prime<span style="color: #008000;">&#91;</span><span style="color: #000040;">++</span>prime<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>i<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> j<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>prime<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #000080;">&lt;=</span>N<span style="color: #000040;">/</span>i<span style="color: #008080;">;</span>j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			prime<span style="color: #008000;">&#91;</span>prime<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #000040;">*</span>i<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>i<span style="color: #000040;">%</span>prime<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #000080;">==</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">return</span> prime<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>算法的思路是这样的：总是使用能整除合数的最小素因子，筛去合数。注意第12行，这句话保证i不被任何比prime[j]小的素数整除，对于i*prime[j]（这个j包括比当前条件成立的j更小的j），它的最小素因子显然就是prime[j]。注意，<b>筛去合数的，总是该合数的最小素因子和与之对应的另一个因子i，所以它只会被筛一次^^</b></p>
<p>类似的可以得到很多积性以及“和性”的函数值，比如欧拉phi函数，sigma函数（n的所有因数和），还有n的所有因子的个数，等等等等。。。

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> ph<span style="color: #008000;">&#91;</span>N<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #008000;">&#123;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>     	<span style="color: #666666;">///phi(x) for x&lt;=N</span>
<span style="color: #0000ff;">int</span> sig<span style="color: #008000;">&#91;</span>N<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #008000;">&#123;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>     	<span style="color: #666666;">///sigma(x) for x&lt;=N,sigma(x) is sum of x's all productors^^</span>
<span style="color: #0000ff;">int</span> productorcnt<span style="color: #008000;">&#91;</span>N<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span> 	<span style="color: #666666;">///count of productor numbers frome 1 ro N</span>
&nbsp;
<span style="color: #0000ff;">void</span> phi_all<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">///get phi(n) from 1 to N in liner time</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000dd;">memset</span><span style="color: #008000;">&#40;</span>ph,<span style="color: #0000dd;">0</span>,<span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">*</span><span style="color: #008000;">&#40;</span>N<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	prime<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #0000dd;">2</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>N<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>ph<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> prime<span style="color: #008000;">&#91;</span><span style="color: #000040;">++</span>prime<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>i,ph<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>i<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> j<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>prime<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #000080;">&lt;=</span>N<span style="color: #000040;">/</span>i<span style="color: #008080;">;</span>j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>i<span style="color: #000040;">%</span>prime<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> ph<span style="color: #008000;">&#91;</span>prime<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #000040;">*</span>i<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>ph<span style="color: #008000;">&#91;</span>prime<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#93;</span><span style="color: #000040;">*</span>ph<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">else</span>
			<span style="color: #008000;">&#123;</span>
			    ph<span style="color: #008000;">&#91;</span>prime<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #000040;">*</span>i<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>ph<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000040;">*</span>prime<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
			    <span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
			<span style="color: #008000;">&#125;</span>
		<span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
&nbsp;
<span style="color: #0000ff;">int</span> min_pk<span style="color: #008000;">&#91;</span>N<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">void</span> sigma_all<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000dd;">memset</span><span style="color: #008000;">&#40;</span>sig,<span style="color: #0000dd;">0</span>,<span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">*</span><span style="color: #008000;">&#40;</span>N<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	sig<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #0000dd;">1</span>,min_pk<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #0000dd;">1</span>,prime<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #0000dd;">2</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>N<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>sig<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> prime<span style="color: #008000;">&#91;</span><span style="color: #000040;">++</span>prime<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>i,sig<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>i<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span>,min_pk<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>i<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> j<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>prime<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #000080;">&lt;=</span>N<span style="color: #000040;">/</span>i<span style="color: #008080;">;</span>j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>i<span style="color: #000040;">%</span>prime<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
			<span style="color: #008000;">&#123;</span>
			    sig<span style="color: #008000;">&#91;</span>i<span style="color: #000040;">*</span>prime<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>sig<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000040;">*</span>sig<span style="color: #008000;">&#91;</span>prime<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
			    min_pk<span style="color: #008000;">&#91;</span>i<span style="color: #000040;">*</span>prime<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>min_pk<span style="color: #008000;">&#91;</span>prime<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
			<span style="color: #008000;">&#125;</span>
			<span style="color: #0000ff;">else</span>
			<span style="color: #008000;">&#123;</span>
				min_pk<span style="color: #008000;">&#91;</span>i<span style="color: #000040;">*</span>prime<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>min_pk<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000040;">*</span>prime<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
				sig<span style="color: #008000;">&#91;</span>i<span style="color: #000040;">*</span>prime<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #008000;">&#40;</span>sig<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000040;">/</span>min_pk<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">*</span>min_pk<span style="color: #008000;">&#91;</span>i<span style="color: #000040;">*</span>prime<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
				<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
			<span style="color: #008000;">&#125;</span>
		<span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>注意：得到的是从1~N之间所有数的对应函数值，而且这上面的每一个函数，都能顺便产生一个对应素数表。用一个50000大小的表，你就能处理50000的平方大小的数的对应函数值了^^</p>
]]></content:encoded>
			<wfw:commentRss>http://www.earthson.net/archives/432/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>代价平摊</title>
		<link>http://www.earthson.net/archives/416</link>
		<comments>http://www.earthson.net/archives/416#comments</comments>
		<pubDate>Sun, 05 Sep 2010 03:30:50 +0000</pubDate>
		<dc:creator>Earthson</dc:creator>
				<category><![CDATA[Math]]></category>
		<category><![CDATA[Fun]]></category>

		<guid isPermaLink="false">http://www.earthson.net/?p=416</guid>
		<description><![CDATA[前天遇到了这么个题目： 给定一幢n层的楼，给你两个杯具，要求用最少的次数，确定杯具从能被扔碎的最低层，注意，要求最坏情况。（这是一个临界点，在这一层的下一层，把杯具扔下，落地不碎，在这一层扔下，杯具碎。。。）** 杯具碎了就不能在用了，注意，杯具只有两个^^ 遇到这个问题，首先得避免二分的泥淖。。在杯具无限的情况下，二分是绝对出色的，但是在杯具有限的情况下（尤其是它少得可怜的时候），二分就杯具无限了。。 其实，通过分析解的形式，我们可以得到一个思路^^ 如果第一个杯具在某一层Hb碎了，最坏我们还需要多少次才能确认在拿一层呢？注意，因为有一个杯具碎了，所以只有一个杯具了。。 这取决于，我们已知的杯具不会碎的最高层Hl，显然，我们知道杯具的临界H应该满足Hb>=H>Hl，在这里，我们最坏需要多少次找到这个值呢？答案是Hb-Hl-1次，这次，我们只能老老实实，从小到大一次一次扔了，因为如果你跳着扔的话，万一杯具碎了，你就没有杯具了，然后你失败了。。 如果我们假设最坏次数是p，我们怎么选择第一次从哪层扔呢？ 答案是第一次从p层扔。显然，第p层扔碎掉是最坏次数是p(就是p-1加上刚才碎掉的那次)，容易看到，这个层数是在p的限制下，我们能取到的最大的一个。我们这个层数取的越大，剩下的层数就越少，如果在第p层没碎的话，剩下的子问题就越小 因为，我们限定了最坏次数p，而且我们已经扔了一次（在第p层），所以如果在p层没碎，问题回到一个n-p大小的子问题（之前我们知道第0层不碎，现在我们知道第p层不碎），因为我们已经扔了一次，这次我们确定一层往下扔，碎了以后，最坏代价要控制在p-1内。当然，同样的我们把这个最大化，我们在子问题的p-1层往下扔（就是p+p-1）子问题的最坏代价是p-1，总的最坏代价还是p（加上之前在原文题p层的那一次，没碎。。） 这个过程不断重复，我们得到p+p-1+p-2+...+2+1=(p+1)*p/2层，也就是最多这么多层的楼，我们能通过这种方式用p确定临界值。现在，反过来，通过楼层数解满足条件的最小的p。。条件是p(p+1)>=2n 事实上，我们平摊了最坏代价，使得最坏情况平均化了，总的最坏代价也就小了。。当然证明本身不是基于平摊的，因为平摊确实不好证明。。]]></description>
			<content:encoded><![CDATA[<p>前天遇到了这么个题目：</p>
<p><b>给定一幢n层的楼，给你两个杯具，要求用最少的次数，确定杯具从能被扔碎的最低层，注意，要求最坏情况。（这是一个临界点，在这一层的下一层，把杯具扔下，落地不碎，在这一层扔下，杯具碎。。。）** 杯具碎了就不能在用了，注意，杯具只有两个^^</b></p>
<p>遇到这个问题，首先得避免二分的泥淖。。在杯具无限的情况下，二分是绝对出色的，但是在杯具有限的情况下（尤其是它少得可怜的时候），二分就杯具无限了。。</p>
<p>其实，通过分析解的形式，我们可以得到一个思路^^</p>
<p><b>如果第一个杯具在某一层Hb碎了，最坏我们还需要多少次才能确认在拿一层呢？注意，因为有一个杯具碎了，所以只有一个杯具了。。</b></p>
<p>这取决于，我们已知的杯具不会碎的最高层Hl，显然，我们知道杯具的临界H应该满足<b>Hb>=H>Hl</b>，在这里，我们最坏需要多少次找到这个值呢？答案是Hb-Hl-1次，这次，我们只能老老实实，从小到大一次一次扔了，因为如果你跳着扔的话，万一杯具碎了，你就没有杯具了，然后你失败了。。</p>
<p><b>如果我们假设最坏次数是p，我们怎么选择第一次从哪层扔呢？</b></p>
<p>答案是第一次从p层扔。显然，第p层扔碎掉是最坏次数是p(就是p-1加上刚才碎掉的那次)，容易看到，这个层数是在p的限制下，我们能取到的最大的一个。我们这个层数取的越大，剩下的层数就越少，如果在第p层没碎的话，剩下的子问题就越小</p>
<p>因为，我们限定了最坏次数p，而且我们已经扔了一次（在第p层），所以如果在p层没碎，问题回到一个n-p大小的子问题（之前我们知道第0层不碎，现在我们知道第p层不碎），因为我们已经扔了一次，这次我们确定一层往下扔，碎了以后，最坏代价要控制在p-1内。当然，同样的我们把这个最大化，我们在子问题的p-1层往下扔（就是p+p-1）子问题的最坏代价是p-1，总的最坏代价还是p（加上之前在原文题p层的那一次，没碎。。）</p>
<p>这个过程不断重复，我们得到p+p-1+p-2+...+2+1=(p+1)*p/2层，也就是最多这么多层的楼，我们能通过这种方式用p确定临界值。现在，反过来，通过楼层数解满足条件的最小的p。。条件是<b>p(p+1)>=2n</b></p>
<p>事实上，我们平摊了最坏代价，使得最坏情况平均化了，总的最坏代价也就小了。。当然证明本身不是基于平摊的，因为平摊确实不好证明。。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.earthson.net/archives/416/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>一旦出现，永不消失</title>
		<link>http://www.earthson.net/archives/404</link>
		<comments>http://www.earthson.net/archives/404#comments</comments>
		<pubDate>Fri, 13 Aug 2010 10:16:18 +0000</pubDate>
		<dc:creator>Earthson</dc:creator>
				<category><![CDATA[混沌]]></category>
		<category><![CDATA[Chaos]]></category>

		<guid isPermaLink="false">http://www.earthson.net/?p=404</guid>
		<description><![CDATA[最终人择原理(Final anthropic principle (FAP)): “包含智慧的资讯处理过程一定会在宇宙中出现，而且，一旦它出现了就不会灭亡。” (Barrow和Tipler，1986)——摘自wikipedia 乍一看，这样论断太不靠谱，因为有太多的因素导致生命消失，这一论断确实是不可思议的。然而，仔细一想，这一论断其实来自于Choas（混沌）：系统一旦变得足够复杂，他将不可逆转的变得越来越复杂。这一模式被打破的概率，是如同时间逆转这种事件般不可思议的事 要理解这些是“困难”的，因为来自物理的现实总会带来不必要的误导！注意以下论述： “人择原理”最初表达：自然定律惊人地适合生命的存在。 为什么？因为生命存在，而且它已经存在！如果这一条不成立，那怎么会有生命呢？另一方面，生命总是适应于它所存在的宇宙，这也是它存在的一个原因。我们应该注意到，没错，是适应！因为我们的宇宙是这个样子的，所以有我们这样的生命，但是，宇宙的不同发展方向，将完全会导致完全不同的场景，可能是完全不同的宇宙常数，完全不同的空间，也许有完全不同的生命。 生命是适应于它所存在的宇宙的，正因为如此，我们宇宙的某些条件并不能成为生命存在的必要条件。说说我前几天还有的一个误区吧:我一直认为，生命的存在依赖于负熵。地球是一个开放系统，有源源不断的负熵输入（稳定的），这些足以维持系统内部的有序（生命）。事实上，地球上的生命也确实非常依赖于这一点。为什么呢？因为负熵给予了系统极大的活力，给予了系统足够的初始复杂度，并且，它是一个外部的进化优势。没错，地球生命适应了这一点。如果负熵的输入不存在了，生命也将能适应这一点，我毫无疑问的相信。 chaos导致，即使是一个确定的系统，也会导致不可思议的事发生。即使是基于非常简单的基本模式，也许最终也会表现出惊人的复杂。更令人不可思议的是，这种复杂会形成模式，会发生自发的组织和进化！如果你对达尔文的进化论有足够的领悟，并不难理解这一点。没错，进化论是一个典型的chaos自进化现象。复杂一旦到达这个模式，他将变得越来越复杂，这一切几乎是不可逆转的。即使出现一个突发的事件，把已有的状态打乱，也很难彻底毁灭，因为彻底把所有的复杂降到一个限度是几乎不可能的，只有上帝（如果它存在的话）才能精确定位每一个复杂系统的位置并把它完全摧毁而不论它有多小，因此复杂被彻底击垮的概率，如同时间逆转般完全不可思议。 人择在某种程度上帮助了人们揭去物理具有误导性的特性，让我们更清楚的看到世界的本质 对混沌有所不解的朋友可以看下这部纪录片——《神秘的混沌理论》（The Secret Life of Chaos）-BBC]]></description>
			<content:encoded><![CDATA[<p><b>最终人择原理(Final anthropic principle (FAP)): “包含智慧的资讯处理过程一定会在宇宙中出现，而且，一旦它出现了就不会灭亡。” (Barrow和Tipler，1986)——摘自wikipedia</b></p>
<p>乍一看，这样论断太不靠谱，因为有太多的因素导致生命消失，这一论断确实是不可思议的。然而，仔细一想，这一论断其实来自于Choas（混沌）：<b>系统一旦变得足够复杂，他将不可逆转的变得越来越复杂。这一模式被打破的概率，是如同时间逆转这种事件般不可思议的事</b></p>
<p>要理解这些是“困难”的，因为来自物理的现实总会带来不必要的误导！注意以下论述：</p>
<p><b>“人择原理”最初表达：自然定律惊人地适合生命的存在。</b></p>
<p>为什么？因为生命存在，而且它已经存在！如果这一条不成立，那怎么会有生命呢？另一方面，生命总是适应于它所存在的宇宙，这也是它存在的一个原因。我们应该注意到，没错，是适应！因为我们的宇宙是这个样子的，所以有我们这样的生命，但是，宇宙的不同发展方向，将完全会导致完全不同的场景，可能是完全不同的宇宙常数，完全不同的空间，也许有完全不同的生命。</p>
<p>生命是适应于它所存在的宇宙的，正因为如此，我们宇宙的某些条件并不能成为生命存在的必要条件。说说我前几天还有的一个误区吧:我一直认为，生命的存在依赖于负熵。地球是一个开放系统，有源源不断的负熵输入（稳定的），这些足以维持系统内部的有序（生命）。事实上，地球上的生命也确实非常依赖于这一点。为什么呢？因为负熵给予了系统极大的活力，给予了系统足够的初始复杂度，并且，它是一个外部的进化优势。没错，地球生命适应了这一点。如果负熵的输入不存在了，生命也将能适应这一点，我毫无疑问的相信。</p>
<p>chaos导致，即使是一个确定的系统，也会导致不可思议的事发生。即使是基于非常简单的基本模式，也许最终也会表现出惊人的复杂。更令人不可思议的是，这种复杂会形成模式，会发生自发的组织和进化！如果你对达尔文的进化论有足够的领悟，并不难理解这一点。没错，进化论是一个典型的chaos自进化现象。复杂一旦到达这个模式，他将变得越来越复杂，这一切几乎是不可逆转的。即使出现一个突发的事件，把已有的状态打乱，也很难彻底毁灭，因为彻底把所有的复杂降到一个限度是几乎不可能的，只有上帝（如果它存在的话）才能精确定位每一个复杂系统的位置并把它完全摧毁而不论它有多小，因此复杂被彻底击垮的概率，如同时间逆转般完全不可思议。</p>
<p>人择在某种程度上帮助了人们揭去物理具有误导性的特性，让我们更清楚的看到世界的本质</p>
<p>对混沌有所不解的朋友可以看下这部纪录片——《神秘的混沌理论》（The Secret Life of Chaos）-BBC</p>
]]></content:encoded>
			<wfw:commentRss>http://www.earthson.net/archives/404/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Warehouse and Truck(joj 2679)</title>
		<link>http://www.earthson.net/archives/373</link>
		<comments>http://www.earthson.net/archives/373#comments</comments>
		<pubDate>Tue, 10 Aug 2010 13:49:21 +0000</pubDate>
		<dc:creator>Earthson</dc:creator>
				<category><![CDATA[ACM]]></category>
		<category><![CDATA[Problems]]></category>

		<guid isPermaLink="false">http://www.earthson.net/?p=373</guid>
		<description><![CDATA[2010吉林省赛E题Warehouse and Truck。卡车在仓库装了货物，送到各个商店（ 所有点都在一条直线上），耗费是当前载重量乘以距离（在每个商店卸下货物之后载重量发生变化）。 比赛的时候没找到算法，这题郁闷很久，一直到现在^^其实想想，当初比赛的时候连什么是DP都不知道。当时在数学上还有些癖好——根本无视递推，当时的我看来，只有通项才是有意义的-_-!确实太固执。。。 当然，我还是找到了解的形式： 显然，一旦到达一个端点，它应该一路直冲到另一端。在到达端点之前，有各种折返，但是可以确定每次折返都是越过仓库的（如果它折回来，必然是越过仓库以后再折回去的）。如上所说，这都是显然的。。。其实依照这些就可以很快导出递推，只不过当时的我对递推很不敏感，这真是杯具。 首先，折返必然是穿越仓库(x=0)的。我们令i表示仓库左边的点，j表示仓库右边的点（我想我不需要用太多晦涩难懂的数学语言来描述这一点）， 我们用表示遍历i,j范围内所有点，但不越出这个范围的最优开销（其实就是一个小的子问题，去掉了i到j外的所有点）。当然这是不够的，根据上面的解的形式，最优解必然在到达一个端点（i或者j）之后，直接转到另一个。我们需要区分两种情况：然后这确实足够了 因为从i到j最优解必然是的最优解末端往右到j。同样，对称的，可以得到j到i的，这样就得到了。 这个递推，虽然描述简单，求起来却很麻烦。鉴于式子过长,代码就不贴了，因为我自己看起来都够呛（表达式很长）。这样的递推时间上是的，其实因为是对分的，所以常数很小^^ 想了下，还是把状态方程写出来。我们令为i到j的距离，令为剩余货物的量（就是i到j所有点的货物全部卸下之后剩下的货物），于是，我们有以下方程： ***如果递推特征不是很明显的话，或许分析解的特征，可以找到更多思路]]></description>
			<content:encoded><![CDATA[<p>
2010吉林省赛E题<a href="http://acm.jlu.edu.cn/joj/upload/jlp2010.pdf">Warehouse and Truck</a>。卡车在仓库装了货物，送到各个商店（ 所有点都在一条直线上），耗费是当前载重量乘以距离（在每个商店卸下货物之后载重量发生变化）。
</p>
<p>
比赛的时候没找到算法，这题郁闷很久，一直到现在^^其实想想，当初比赛的时候连什么是DP都不知道。当时在数学上还有些癖好——根本无视递推，当时的我看来，只有通项才是有意义的-_-!确实太固执。。。<br />
当然，我还是找到了解的形式：
</p>
<p><b><br />
显然，一旦到达一个端点，它应该一路直冲到另一端。在到达端点之前，有各种折返，但是可以确定每次折返都是越过仓库的（如果它折回来，必然是越过仓库以后再折回去的）。</b>如上所说，这都是显然的。。。其实依照这些就可以很快导出递推，只不过当时的我对递推很不敏感，这真是杯具。
</p>
<p>
首先，折返必然是穿越仓库(x=0)的。我们令i表示仓库左边的点，j表示仓库右边的点（我想我不需要用太多晦涩难懂的数学语言来描述这一点），<br />
我们用<img src='http://s.wordpress.com/latex.php?latex=d_%7Bi%2Cj%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='d_{i,j}' title='d_{i,j}' class='latex' />表示遍历i,j范围内所有点，但不越出这个范围的最优开销（其实就是一个小的子问题，去掉了i到j外的所有点）。当然这是不够的，根据上面的解的形式，最优解必然在到达一个端点（i或者j）之后，直接转到另一个。我们需要区分两种情况：<img src='http://s.wordpress.com/latex.php?latex=i%5Crightarrow%7Bj%7D%20%5C%3Bor%5C%3B%20j%5Crightarrow%7Bi%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='i\rightarrow{j} \;or\; j\rightarrow{i}' title='i\rightarrow{j} \;or\; j\rightarrow{i}' class='latex' />然后这确实足够了
</p>
<p>
因为从i到j最优解必然是<img src='http://s.wordpress.com/latex.php?latex=i%5Crightarrow%7B%28j-1%29%7D%20%5C%3Bor%5C%3B%20%7B%28j-1%29%7D%5Crightarrow%7Bi%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='i\rightarrow{(j-1)} \;or\; {(j-1)}\rightarrow{i}' title='i\rightarrow{(j-1)} \;or\; {(j-1)}\rightarrow{i}' class='latex' />的最优解末端往右到j。同样，对称的，可以得到j到i的，这样就得到了<img src='http://s.wordpress.com/latex.php?latex=d_%7Bi%2Cj%7D%20%5C%3Band%5C%3Bd_%7Bj%2Ci%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='d_{i,j} \;and\;d_{j,i}' title='d_{i,j} \;and\;d_{j,i}' class='latex' />。
</p>
<p>
这个递推，虽然描述简单，求起来却很麻烦。鉴于式子过长,代码就不贴了，因为我自己看起来都够呛（表达式很长）。这样的递推时间上是<img src='http://s.wordpress.com/latex.php?latex=O%28n%5E2%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(n^2)' title='O(n^2)' class='latex' />的，其实因为是对分的，所以常数很小^^
</p>
<p>想了下，还是把状态方程写出来。我们令<img src='http://s.wordpress.com/latex.php?latex=L_%7Bi%2Cj%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='L_{i,j}' title='L_{i,j}' class='latex' />为i到j的距离，令<img src='http://s.wordpress.com/latex.php?latex=H_%7Bi%2Cj%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='H_{i,j}' title='H_{i,j}' class='latex' />为剩余货物的量（就是i到j所有点的货物全部卸下之后剩下的货物），于是，我们有以下方程：</p>
<p><img src='http://s.wordpress.com/latex.php?latex=d_%7Bi%2Cj%7D%3D%5Cmin%5C%3B%5C%7B%5C%3Bd_%7Bi%2Cj-1%7D%2BH_%7Bi%2Cj-1%7D%5Ccdot%20L_%7Bj-1%2Cj%7D%5C%3B%5C%3B%2C%5C%3B%5C%3Bd_%7Bj-1%2Ci%7D%2BH_%7Bi%2Cj-1%7D%5Ccdot%20L_%7Bi%2Cj%7D%5C%3B%5C%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='d_{i,j}=\min\;\{\;d_{i,j-1}+H_{i,j-1}\cdot L_{j-1,j}\;\;,\;\;d_{j-1,i}+H_{i,j-1}\cdot L_{i,j}\;\}' title='d_{i,j}=\min\;\{\;d_{i,j-1}+H_{i,j-1}\cdot L_{j-1,j}\;\;,\;\;d_{j-1,i}+H_{i,j-1}\cdot L_{i,j}\;\}' class='latex' /><br />
<img src='http://s.wordpress.com/latex.php?latex=d_%7Bj%2Ci%7D%3D%5Cmin%5C%3B%5C%7B%5C%3Bd_%7Bj%2Ci%2B1%7D%2BH_%7Bi%2B1%2Cj%7D%5Ccdot%20L_%7Bi%2Ci%2B1%7D%5C%3B%5C%3B%2C%5C%3B%5C%3Bd_%7Bi%2B1%2Cj%7D%2BH_%7Bi%2B1%2Cj%7D%5Ccdot%20L_%7Bi%2Cj%7D%5C%3B%5C%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='d_{j,i}=\min\;\{\;d_{j,i+1}+H_{i+1,j}\cdot L_{i,i+1}\;\;,\;\;d_{i+1,j}+H_{i+1,j}\cdot L_{i,j}\;\}' title='d_{j,i}=\min\;\{\;d_{j,i+1}+H_{i+1,j}\cdot L_{i,i+1}\;\;,\;\;d_{i+1,j}+H_{i+1,j}\cdot L_{i,j}\;\}' class='latex' /></p>
<p><b>***如果递推特征不是很明显的话，或许分析解的特征，可以找到更多思路</b></p>
]]></content:encoded>
			<wfw:commentRss>http://www.earthson.net/archives/373/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>费马素数</title>
		<link>http://www.earthson.net/archives/345</link>
		<comments>http://www.earthson.net/archives/345#comments</comments>
		<pubDate>Tue, 10 Aug 2010 02:05:04 +0000</pubDate>
		<dc:creator>Earthson</dc:creator>
				<category><![CDATA[Math]]></category>
		<category><![CDATA[数论]]></category>

		<guid isPermaLink="false">http://www.earthson.net/?p=345</guid>
		<description><![CDATA[费马素数指的是形如的素数。现在考虑一个一般的形式 在什么情况下p必为合数？ 注意到以下式子 显然，等号后面是一个整数。我们令b=-1，如果m是一个奇数我们将发现能被a+1整除。如果考虑置换，注意到的值并没有变化。但是能被a+1整除（同上），所以如果m含有2以外的因子（除非是1），则必为合数。 至于等号后面的剩余部分，它是如同梅森素数般难缠的家伙，注意到他的项数是一个素数，以后慢慢研究]]></description>
			<content:encoded><![CDATA[<p>
费马素数指的是形如<img src='http://s.wordpress.com/latex.php?latex=2%5E%7B2%5Em%7D%2B1&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='2^{2^m}+1' title='2^{2^m}+1' class='latex' />的素数。现在考虑一个一般的形式<img src='http://s.wordpress.com/latex.php?latex=p%3Da%5Em%2B1%2Ca%3E1&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='p=a^m+1,a&gt;1' title='p=a^m+1,a&gt;1' class='latex' />  在什么情况下p必为合数？
</p>
<p>
注意到以下式子<br />
<img src="http://www.quantnet.com/cgi-bin/mathtex.cgi? \frac{a^m-b^m}{a-b}=\sum_{i=0}^{m-1}a^{m-1-i}b^i" style="float:top;" border="0px" /><br />
显然，等号后面是一个整数。我们令b=-1，如果m是一个奇数我们将发现<img src='http://s.wordpress.com/latex.php?latex=a%5Em%2B1&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='a^m+1' title='a^m+1' class='latex' />能被a+1整除。如果考虑置换<img src='http://s.wordpress.com/latex.php?latex=m%3D%5Cfrac%7Bm%7D%7B2%5Es%7D%2Ca%3Da%5E%7B2%5Es%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='m=\frac{m}{2^s},a=a^{2^s}' title='m=\frac{m}{2^s},a=a^{2^s}' class='latex' />，注意到<img src='http://s.wordpress.com/latex.php?latex=a%5Em%2B1&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='a^m+1' title='a^m+1' class='latex' />的值并没有变化。但是<img src='http://s.wordpress.com/latex.php?latex=a%5Em%2B1&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='a^m+1' title='a^m+1' class='latex' />能被a+1整除（同上），所以如果m含有2以外的因子（除非是1），则<img src='http://s.wordpress.com/latex.php?latex=a%5Em%2B1&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='a^m+1' title='a^m+1' class='latex' />必为合数。
</p>
<p>至于等号后面的剩余部分，它是如同梅森素数般难缠的家伙，注意到他的项数是一个素数，以后慢慢研究</p>
]]></content:encoded>
			<wfw:commentRss>http://www.earthson.net/archives/345/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

