<?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>Aikilis&#039; Blog</title>
	<atom:link href="http://aikilis.tk/feed" rel="self" type="application/rss+xml" />
	<link>http://aikilis.tk</link>
	<description>Mathematics, Computer Science and puzzles.</description>
	<lastBuildDate>Thu, 10 May 2012 09:08:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>逆康托展开与康托展开</title>
		<link>http://aikilis.tk/1764.html</link>
		<comments>http://aikilis.tk/1764.html#comments</comments>
		<pubDate>Sun, 06 May 2012 03:50:17 +0000</pubDate>
		<dc:creator>Aikilis</dc:creator>
				<category><![CDATA[数学与计算机科学]]></category>
		<category><![CDATA[数论]]></category>
		<category><![CDATA[算法]]></category>
		<category><![CDATA[组合数学]]></category>

		<guid isPermaLink="false">http://aikilis.tk/1764.html</guid>
		<description><![CDATA[        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div>引言 我们可以把{1,2,3,4,&#8230;,n}的n!个全排列按照字典序从小到大列出，例如对n=3而言，我们可以得到： 1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1 现在给出{1,2,3,4,&#8230;,n}的一个全排列，问这个全排列按字典序是第几小的？ 逆康托展开 设p[0],p[1],&#8230;,p[n-1]是{1,2,&#8230;,n}的一个全排列。 令c[k]表示比p[k],p[k+1],&#8230;,p[n-1]小的{p[k],p[k+1],&#8230;,p[n-1]}的全排列的个数。 则c[0]+1便是我们要求的。 比p[k],p[k+1],&#8230;,p[n-1]小的全排列有两种类型，第一种是第一位小于p[k]的，第二种是第一位等于p[k]的，对于第一种情况而言，我们注意到这个全排列的首位可能取的值就为p[k+1],&#8230;,p[n-1]中比p[k]小的数的个数，我们记为r[k]，然后对于第一位的每一种取法，剩下的数都有(n-k-1)!种可能排列，所以第一种类型的全排列共有r[k](n-k-1)!个。 对于第二种类型的全排列，由于其第一位等于p[k]，要使得它小于p[k],p[k+1],&#8230;,p[n-1]，则必然它从第二位开始的全排列要小于p[k+1],&#8230;,p[n-1]，所以共有c[k+1]种情况。注意到这里k必须小于n，为了方便起见，我们规定c[n]=0。 于是我们得到： c[k]=r[k](n-k-1)!+c[k+1] c[n]=0 其中r[k]表示p[k+1],&#8230;,p[n-1]中比p[k]小的数的个数（即逆序数[1]）。 利用这个递推关系解决上面的问题的算法被称为逆康托展开。 下面是C++程序: #include &#60;stdio.h&#62; #define N (13) int factor[N]={1}; int cantor(int*p,int n,int k); int main() { for (int i=1;i&#60;N;++i) factor[i]=i*factor[i-1]; int &#8230; <a href="http://aikilis.tk/1764.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div><h1>引言</h1>
<p>我们可以把{1,2,3,4,&#8230;,n}的n!个全排列按照字典序从小到大列出，例如对n=3而言，我们可以得到：</p>
<blockquote><p align="center">1,2,3</p>
<p align="center">1,3,2</p>
<p align="center">2,1,3</p>
<p align="center">2,3,1</p>
<p align="center">3,1,2</p>
<p align="center">3,2,1</p>
</blockquote>
<p align="left">现在给出{1,2,3,4,&#8230;,n}的一个全排列，问这个全排列按字典序是第几小的？</p>
<h1>逆康托展开</h1>
<p>设p[0],p[1],&#8230;,p[n-1]是{1,2,&#8230;,n}的一个全排列。</p>
<p>令c[k]表示比p[k],p[k+1],&#8230;,p[n-1]小的{p[k],p[k+1],&#8230;,p[n-1]}的全排列的个数。</p>
<p>则c[0]+1便是我们要求的。</p>
<p>比p[k],p[k+1],&#8230;,p[n-1]小的全排列有两种类型，第一种是第一位小于p[k]的，第二种是第一位等于p[k]的，对于第一种情况而言，我们注意到这个全排列的首位可能取的值就为p[k+1],&#8230;,p[n-1]中比p[k]小的数的个数，我们记为r[k]，然后对于第一位的每一种取法，剩下的数都有(n-k-1)!种可能排列，所以第一种类型的全排列共有r[k](n-k-1)!个。</p>
<p>对于第二种类型的全排列，由于其第一位等于p[k]，要使得它小于p[k],p[k+1],&#8230;,p[n-1]，则必然它从第二位开始的全排列要小于p[k+1],&#8230;,p[n-1]，所以共有c[k+1]种情况。注意到这里k必须小于n，为了方便起见，我们规定c[n]=0。</p>
<p>于是我们得到：</p>
<blockquote><p align="center">c[k]=r[k](n-k-1)!+c[k+1]</p>
<p align="center">c[n]=0</p>
</blockquote>
<p align="left">其中r[k]表示p[k+1],&#8230;,p[n-1]中比p[k]小的数的个数（即逆序数[1]）。</p>
<p align="left">利用这个递推关系解决上面的问题的算法被称为逆康托展开。</p>
<p align="left">下面是C++程序:</p>
<blockquote><pre>#include &lt;stdio.h&gt;
#define N (13)
<span style="color: #0000ff">int</span> factor[N]={1};
<span style="color: #0000ff">int</span> cantor(<span style="color: #0000ff">int</span>*p,<span style="color: #0000ff">int</span> n,<span style="color: #0000ff">int</span> k);
<span style="color: #0000ff">int</span> main()
{
	<span style="color: #0000ff">for</span> (<span style="color: #0000ff">int</span> i=1;i&lt;N;++i) factor[i]=i*factor[i-1];
	<span style="color: #0000ff">int</span> n,p[N];
	<span style="color: #0000ff">while</span> (EOF!=scanf("<span style="color: #8b0000">%d</span>",&amp;n))
	{
		<span style="color: #0000ff">for</span> (<span style="color: #0000ff">int</span> i=0;i&lt;n;++i) scanf("<span style="color: #8b0000">%d</span>",p+i);
		printf("<span style="color: #8b0000">%d\n\n</span>",1+cantor(p,n,0));
	}
	<span style="color: #0000ff">return</span> 0;
}
<span style="color: #0000ff">int</span> cantor(<span style="color: #0000ff">int</span>*p,<span style="color: #0000ff">int</span> n,<span style="color: #0000ff">int</span> k)
{
	<span style="color: #0000ff">if</span> (k&gt;=n) <span style="color: #0000ff">return</span> 0;
	<span style="color: #0000ff">int</span> r=0;
	<span style="color: #0000ff">for</span> (<span style="color: #0000ff">int</span> i=k+1;i&lt;n;++i) <span style="color: #0000ff">if</span> (p[k]&gt;p[i]) ++r;
	<span style="color: #0000ff">return</span> r*factor[n-k-1]+cantor(p,n,k+1);
}</pre>
</blockquote>
<h1>康托展开</h1>
<p>现在考虑问题的逆问题，给出n，再给出一个整数m，问{1,2,3,&#8230;,n}的第m小的全排列是什么。</p>
<p>我们先把m减1.</p>
<p>这样m表示比所求全排列小的排列的个数。</p>
<p>根据刚才的逆康托展开，我们知道有m=r[0](n-1)!+r[1](n-2)!+&#8230;+r[n-1]0!</p>
<p>我们用(n-1)!除m，由于m=m=r[0](n-1)!+r[1](n-2)!+&#8230;+r[n-1]0!，而又可以用归纳法证明r[1](n-2)!+&#8230;+r[n-1]0!小于(n-1)!，所以根据带余除法定理,r[0]为商,r[1](n-2)!+&#8230;+r[n-1]0!为余数。</p>
<p>然后再用(n-2)!除r[1](n-2)!+&#8230;+r[n-1]0!，同样的可以得到r[1]。</p>
<p>依此进行下去，我们将得到r[0],r[1],&#8230;,r[n-1]。</p>
<p>现在考虑如何从 r[]反推出p[]。</p>
<p>对r[0]而言，由于其在首位，所以r[0]=p[0]-1，即p[0]=1+r[0]。</p>
<p>同样的原因，考虑p[1]的计算，显然其为不等于p[0]的第r[1]+1小的数。</p>
<p>而p[2]等于除p[0]，p[1]外第r[2]+1小的数，</p>
<p>以此类推，我们便得到全部的p[0],p[1],&#8230;,p[n-1]了。</p>
<h1>应用</h1>
<p>康托展开在计算机中的主要应用是作哈希函数[2]，因为它实现了整数和排列的一一对应。</p>
<h1></h1>
<h1>参考文献</h1>
<p>[1]<a href="http://aikilis.tk/?p=1303" target="_blank">Aikilis:逆序数与排序.</a></p>
<p>[2]<a href="http://www.cnblogs.com/foreverzsz/archive/2010/11/10/1874139.html" target="_blank">forever zsz:康托展开.</a></p>
<p style='text-align:left'>&copy; 2012, <a href='http://aikilis.tk'>Aikilis</a>. 版权所有. 转载请注明出自<a href="http://aikilis.tk/">http://aikilis.tk/</a>.</p>

	Tags: <a href="http://aikilis.tk/tag/%e6%95%b0%e8%ae%ba" title="数论" rel="tag">数论</a>, <a href="http://aikilis.tk/tag/%e7%ae%97%e6%b3%95" title="算法" rel="tag">算法</a>, <a href="http://aikilis.tk/tag/%e7%bb%84%e5%90%88%e6%95%b0%e5%ad%a6" title="组合数学" rel="tag">组合数学</a><br />
]]></content:encoded>
			<wfw:commentRss>http://aikilis.tk/1764.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>水仙花数</title>
		<link>http://aikilis.tk/1759.html</link>
		<comments>http://aikilis.tk/1759.html#comments</comments>
		<pubDate>Fri, 04 May 2012 05:36:21 +0000</pubDate>
		<dc:creator>Aikilis</dc:creator>
				<category><![CDATA[数学与计算机科学]]></category>
		<category><![CDATA[数论]]></category>

		<guid isPermaLink="false">http://aikilis.tk/1759.html</guid>
		<description><![CDATA[        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div>引言 如果一个自然数的每位数字的立方之和等于这个数本身，则称这个数为水仙花数。比如0,1,153。 寻找某个范围类的水仙花数的任务经常作为编程教学的练习题出现，现在我想做的是寻找全部的水仙花数。 水仙花数有有穷的 注意到，任何一个位的水仙花数，根据定义，都有，另一方面，由于是一个位数，所以必然有，这样我们便得到： 解这个不等式得到。 这说明水仙花数最大是个四位数，也就是说水仙花数是有穷的，而且必定小于10000。 既然水仙花数是有穷的，而且我们找到了一个不大的上限，那么这个问题便可以通过编程而得到完美解决。 搜索程序 我们只需要找到10000以内的水仙花数，根据上面的结论，这就是全部的水仙花数。 这可以通过如下一个简单的C++程序来完成。 #include &#60;stdio.h&#62; int main() { for (int a=0;a&#60;10;++a) for (int b=0;b&#60;10;++b) for (int c=0;c&#60;10;++c) for (int d=0;d&#60;10;++d) if (a*a*a+b*b*b+c*c*c+d*d*d==1000*a+100*b+10*c+d) printf("%d\n",1000*a+100*b+10*c+d); return 0; } 结论 程序运行结果显示，水仙花数非常稀少，一共只有6个： 0,1,153,370,371,407 附程序运行效果图： &#169; 2012, &#8230; <a href="http://aikilis.tk/1759.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div><h1>引言</h1>
<p>如果一个自然数的每位数字的立方之和等于这个数本身，则称这个数为水仙花数。比如0,1,153。</p>
<p>寻找某个范围类的水仙花数的任务经常作为编程教学的练习题出现，现在我想做的是寻找全部的水仙花数。</p>
<h1>水仙花数有有穷的</h1>
<p>注意到，任何一个<img src="http://www.forkosh.com/mathtex.cgi?n" style="float:top;" border="0px" />位的水仙花数<img src="http://www.forkosh.com/mathtex.cgi?x=\sum_{k=0}^{k=n-1}{a_k{10^k}}" style="float:top;" border="0px" />，根据定义，都有<img src="http://www.forkosh.com/mathtex.cgi?x=a_0^3+a_1^3+\ldots+a_{n-1}^3\leq9^3+9^3+\ldots+9^3=n9^3" style="float:top;" border="0px" />，另一方面，由于<img src="http://www.forkosh.com/mathtex.cgi?x" style="float:top;" border="0px" />是一个<img src="http://www.forkosh.com/mathtex.cgi?n" style="float:top;" border="0px" />位数，所以必然有<img src="http://www.forkosh.com/mathtex.cgi?x\geq10^{n-1}" style="float:top;" border="0px" />，这样我们便得到：</p>
<p align="center"><img src="http://www.forkosh.com/mathtex.cgi?n9^3\geq10^{n-1}" style="float:top;" border="0px" /></p>
<p align="left">解这个不等式得到<img src="http://www.forkosh.com/mathtex.cgi?n\leq4" style="float:top;" border="0px" />。</p>
<p align="left">这说明水仙花数最大是个四位数，也就是说水仙花数是有穷的，而且必定小于10000。</p>
<h1></h1>
<p>既然水仙花数是有穷的，而且我们找到了一个不大的上限，那么这个问题便可以通过编程而得到完美解决。</p>
<h1>搜索程序</h1>
<p>我们只需要找到10000以内的水仙花数，根据上面的结论，这就是全部的水仙花数。</p>
<p>这可以通过如下一个简单的C++程序来完成。</p>
<blockquote><pre>#include &lt;stdio.h&gt;
<span style="color: #0000ff">int</span> main()
{
	<span style="color: #0000ff">for</span> (<span style="color: #0000ff">int</span> a=0;a&lt;10;++a)
		<span style="color: #0000ff">for</span> (<span style="color: #0000ff">int</span> b=0;b&lt;10;++b)
			<span style="color: #0000ff">for</span> (<span style="color: #0000ff">int</span> c=0;c&lt;10;++c)
				<span style="color: #0000ff">for</span> (<span style="color: #0000ff">int</span> d=0;d&lt;10;++d)
					<span style="color: #0000ff">if</span> (a*a*a+b*b*b+c*c*c+d*d*d==1000*a+100*b+10*c+d)
						printf("<span style="color: #8b0000">%d\n</span>",1000*a+100*b+10*c+d);
	<span style="color: #0000ff">return</span> 0;
}</pre>
</blockquote>
<h1>结论</h1>
<p>程序运行结果显示，水仙花数非常稀少，一共只有6个：</p>
<blockquote>
<p align="center">0,1,153,370,371,407</p>
</blockquote>
<p align="left">附程序运行效果图：</p>
<p align="left"><a href="http://aikilis.tk/files/2012/05/image.png"><img style="border-bottom: 0px;border-left: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="image" src="http://aikilis.tk/files/2012/05/image_thumb.png" width="681" height="446"></a></p>
<p style='text-align:left'>&copy; 2012, <a href='http://aikilis.tk'>Aikilis</a>. 版权所有. 转载请注明出自<a href="http://aikilis.tk/">http://aikilis.tk/</a>.</p>

	Tags: <a href="http://aikilis.tk/tag/%e6%95%b0%e8%ae%ba" title="数论" rel="tag">数论</a><br />
]]></content:encoded>
			<wfw:commentRss>http://aikilis.tk/1759.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>最大最小乘积和</title>
		<link>http://aikilis.tk/1752.html</link>
		<comments>http://aikilis.tk/1752.html#comments</comments>
		<pubDate>Mon, 16 Apr 2012 03:29:14 +0000</pubDate>
		<dc:creator>Aikilis</dc:creator>
				<category><![CDATA[数学与计算机科学]]></category>
		<category><![CDATA[算术与代数]]></category>

		<guid isPermaLink="false">http://aikilis.tk/1752.html</guid>
		<description><![CDATA[        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div>问题 设，其中和分别是两个正实数序列，各自有个元素。 证明： 在这两个序列的所有排列中，当两个系列都排序（非降序排序）时，取最大值。 在这两个序列的所有排列中，当一个序列排成非降序，另一个序列排成非升序时，取最小值。 证明 不失一般性，这里只证明问题(1)，问题(2)类似。 假设和都已按不降序排列。 考虑，注意到任何其他的排列方式，都等价于交换中某些的值。 现在证明任何这样的交换都不会使得更大。 假设交换，其中，这将使得产生增量，这说明这样的变换不可能使得增大。 故是最大值。 &#169; 2012, Aikilis. 版权所有. 转载请注明出自http://aikilis.tk/. Tags: 算术与代数]]></description>
			<content:encoded><![CDATA[        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div><h1>问题</h1>
<p>设<img src="http://www.forkosh.com/mathtex.cgi?S=x_1y_1+x_2y_2+\ldots +x_ny_n" style="float:top;" border="0px" />，其中<img src="http://www.forkosh.com/mathtex.cgi?x_1,x2,\ldots ,x_n" style="float:top;" border="0px" />和<img src="http://www.forkosh.com/mathtex.cgi?y_1,y_2,\ldots ,y_n" style="float:top;" border="0px" />分别是两个正实数序列，各自有<img src="http://www.forkosh.com/mathtex.cgi?n" style="float:top;" border="0px" />个元素。</p>
<p>证明：</p>
<ol>
<li>在这两个序列的所有排列中，当两个系列都排序（非降序排序）时，<img src="http://www.forkosh.com/mathtex.cgi?S" style="float:top;" border="0px" />取最大值。
<li>在这两个序列的所有排列中，当一个序列排成非降序，另一个序列排成非升序时，<img src="http://www.forkosh.com/mathtex.cgi?S" style="float:top;" border="0px" />取最小值。</li>
</ol>
<h1>证明</h1>
<p>不失一般性，这里只证明问题(1)，问题(2)类似。</p>
<p>假设<img src="http://www.forkosh.com/mathtex.cgi?x_1,x2,\ldots ,x_n" style="float:top;" border="0px" />和<img src="http://www.forkosh.com/mathtex.cgi?y_1,y_2,\ldots ,y_n" style="float:top;" border="0px" />都已按不降序排列。</p>
<p>考虑<img src="http://www.forkosh.com/mathtex.cgi?S=x_1y_1+x_2y_2+\ldots +x_ny_n" style="float:top;" border="0px" />，注意到任何其他的排列方式，都等价于交换<img src="http://www.forkosh.com/mathtex.cgi?x_1y_1+x_2y_2+\ldots +x_ny_n" style="float:top;" border="0px" />中某些<img src="http://www.forkosh.com/mathtex.cgi?y" style="float:top;" border="0px" />的值。</p>
<p>现在证明任何这样的交换都不会使得<img src="http://www.forkosh.com/mathtex.cgi?S" style="float:top;" border="0px" />更大。</p>
<p>假设交换<img src="http://www.forkosh.com/mathtex.cgi?y_i,y_j" style="float:top;" border="0px" />，其中<img src="http://www.forkosh.com/mathtex.cgi?i&lt;j" style="float:top;" border="0px" />，这将使得<img src="http://www.forkosh.com/mathtex.cgi?S" style="float:top;" border="0px" />产生增量<img src="http://www.forkosh.com/mathtex.cgi?(x_iy_j+x_jy_i)-(x_iy_i+x_jy_j)=x_i(y_j-y_i)+x_j(y_i-y_j)=(x_i-x_j)(y_j-y_i)\le 0" style="float:top;" border="0px" />，这说明这样的变换不可能使得<img src="http://www.forkosh.com/mathtex.cgi?S" style="float:top;" border="0px" />增大。</p>
<p>故<img src="http://www.forkosh.com/mathtex.cgi?S=x_1y_1+x_2y_2+\ldots +x_ny_n" style="float:top;" border="0px" />是最大值。</p>
<p style='text-align:left'>&copy; 2012, <a href='http://aikilis.tk'>Aikilis</a>. 版权所有. 转载请注明出自<a href="http://aikilis.tk/">http://aikilis.tk/</a>.</p>

	Tags: <a href="http://aikilis.tk/tag/%e7%ae%97%e6%9c%af%e4%b8%8e%e4%bb%a3%e6%95%b0" title="算术与代数" rel="tag">算术与代数</a><br />
]]></content:encoded>
			<wfw:commentRss>http://aikilis.tk/1752.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>趣题:黑板上的数</title>
		<link>http://aikilis.tk/1748.html</link>
		<comments>http://aikilis.tk/1748.html#comments</comments>
		<pubDate>Sun, 15 Apr 2012 12:32:17 +0000</pubDate>
		<dc:creator>Aikilis</dc:creator>
				<category><![CDATA[数学与计算机科学]]></category>
		<category><![CDATA[数论]]></category>

		<guid isPermaLink="false">http://aikilis.tk/1748.html</guid>
		<description><![CDATA[        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div>问题 在黑板上写数字1,2,&#8230;,2n，其中n是奇数，从中挑出两个数j和k，在黑板上写&#124;j-k&#124;并擦掉j和k。继续这个过程，直到黑板上只写一个整数为止。证明：这个整数必为奇数。 证明 假设现在黑板上有个奇数和个偶数，我们任意挑出两个数。 如果这两个数都为奇数，那么为偶数，那么在写上新数并擦掉旧数后，黑板上将有个奇数，个偶数。 如果这两个数都为偶数，那么为偶数，那么在写上新数并擦掉旧数后，黑板上将有个奇数，个偶数。 如果这两个数一奇一偶，那么为奇数，那么在写上新数并擦掉旧数后，黑板上将有个奇数，个偶数。 由上可知，不管选择怎样的两个数，黑板上奇数的个数要么不变，要么减小2，这说明不管执行多少次题述过程，黑板上奇数的个数的奇偶性都不会发生改变。 我们知道初始时有个奇数，而是一个奇数，那么不管怎样，黑板上总会有奇数个奇数，于是当黑板上只有一个数时，这个数必然是奇数。 &#169; 2012, Aikilis. 版权所有. 转载请注明出自http://aikilis.tk/. Tags: 数论]]></description>
			<content:encoded><![CDATA[        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div><h1>问题</h1>
<p>在黑板上写数字1,2,&#8230;,2n，其中n是奇数，从中挑出两个数j和k，在黑板上写|j-k|并擦掉j和k。继续这个过程，直到黑板上只写一个整数为止。证明：这个整数必为奇数。</p>
<h1>证明</h1>
<p>假设现在黑板上有<img src="http://www.forkosh.com/mathtex.cgi?x" style="float:top;" border="0px" />个奇数和<img src="http://www.forkosh.com/mathtex.cgi?y" style="float:top;" border="0px" />个偶数，我们任意挑出两个数<img src="http://www.forkosh.com/mathtex.cgi?j,k" style="float:top;" border="0px" />。</p>
<ol>
<li>如果这两个数都为奇数，那么<img src="http://www.forkosh.com/mathtex.cgi?|j-k|" style="float:top;" border="0px" />为偶数，那么在写上新数并擦掉旧数后，黑板上将有<img src="http://www.forkosh.com/mathtex.cgi?x-2" style="float:top;" border="0px" />个奇数，<img src="http://www.forkosh.com/mathtex.cgi?y+1" style="float:top;" border="0px" />个偶数。</li>
<li>如果这两个数都为偶数，那么<img src="http://www.forkosh.com/mathtex.cgi?|j-k|" style="float:top;" border="0px" />为偶数，那么在写上新数并擦掉旧数后，黑板上将有<img src="http://www.forkosh.com/mathtex.cgi?x" style="float:top;" border="0px" />个奇数，<img src="http://www.forkosh.com/mathtex.cgi?y-1" style="float:top;" border="0px" />个偶数。</li>
<li>如果这两个数一奇一偶，那么<img src="http://www.forkosh.com/mathtex.cgi?|j-k|" style="float:top;" border="0px" />为奇数，那么在写上新数并擦掉旧数后，黑板上将有<img src="http://www.forkosh.com/mathtex.cgi?x" style="float:top;" border="0px" />个奇数，<img src="http://www.forkosh.com/mathtex.cgi?y-1" style="float:top;" border="0px" />个偶数。</li>
</ol>
<p>由上可知，不管选择怎样的两个数，黑板上奇数的个数要么不变，要么减小2，这说明不管执行多少次题述过程，黑板上奇数的个数的奇偶性都不会发生改变。</p>
<p>我们知道初始时有<img src="http://www.forkosh.com/mathtex.cgi?n" style="float:top;" border="0px" />个奇数，而<img src="http://www.forkosh.com/mathtex.cgi?n" style="float:top;" border="0px" />是一个奇数，那么不管怎样，黑板上总会有奇数个奇数，于是当黑板上只有一个数时，这个数必然是奇数。</p>
<p style='text-align:left'>&copy; 2012, <a href='http://aikilis.tk'>Aikilis</a>. 版权所有. 转载请注明出自<a href="http://aikilis.tk/">http://aikilis.tk/</a>.</p>

	Tags: <a href="http://aikilis.tk/tag/%e6%95%b0%e8%ae%ba" title="数论" rel="tag">数论</a><br />
]]></content:encoded>
			<wfw:commentRss>http://aikilis.tk/1748.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>整数的平方根为什么是无理数</title>
		<link>http://aikilis.tk/1743.html</link>
		<comments>http://aikilis.tk/1743.html#comments</comments>
		<pubDate>Sun, 15 Apr 2012 07:45:45 +0000</pubDate>
		<dc:creator>Aikilis</dc:creator>
				<category><![CDATA[数学与计算机科学]]></category>
		<category><![CDATA[数学分析]]></category>
		<category><![CDATA[数论]]></category>

		<guid isPermaLink="false">http://aikilis.tk/1743.html</guid>
		<description><![CDATA[        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div>引言 初中生便可以做出是无理数的证明，而我们都知道，是无理数，一般的，对于正整数，我们都默认是无理数，除了那些特别的被称为完全平方数的正整数，比如1,4,9,16,25。现在要求对这个默认的假设做出证明。 问题 是一个不是完全平方数的正整数，求证是无理数。 证明 我们知道完全平方数的算术平方根是整数，而非完全平方整数的平方根如果是有理数，那么一定是分数，所以要证明原命题，我们只需要证明不存在一个分数，它的平方是整数。 对于任意一个分数，其中是互质的整数且。 考察它的平方，若其为一个整数，必有整除，而这将与互质矛盾，因为我们若对分解质因数，由于其互质，所以不会有相同的素因子，所以和 也不会有相同的素因子，所以互质。 故不可能为整数。 原命题得证。 &#169; 2012, Aikilis. 版权所有. 转载请注明出自http://aikilis.tk/. Tags: 数学分析, 数论]]></description>
			<content:encoded><![CDATA[        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div><h1>引言</h1>
<p>初中生便可以做出<img src="http://www.forkosh.com/mathtex.cgi?\sqrt2" style="float:top;" border="0px" />是无理数的证明，而我们都知道<img src="http://www.forkosh.com/mathtex.cgi?\sqrt3" style="float:top;" border="0px" />，<img src="http://www.forkosh.com/mathtex.cgi?\sqrt5" style="float:top;" border="0px" />是无理数，一般的，对于正整数<img src="http://www.forkosh.com/mathtex.cgi?n" style="float:top;" border="0px" />，我们都默认<img src="http://www.forkosh.com/mathtex.cgi?\sqrt{n}" style="float:top;" border="0px" />是无理数，除了那些特别的被称为完全平方数的正整数，比如1,4,9,16,25。现在要求对这个默认的假设做出证明。</p>
<h1>问题</h1>
<p><img src="http://www.forkosh.com/mathtex.cgi?n" style="float:top;" border="0px" />是一个不是完全平方数的正整数，求证<img src="http://www.forkosh.com/mathtex.cgi?\sqrt{n}" style="float:top;" border="0px" />是无理数。</p>
<h1>证明</h1>
<p>我们知道完全平方数的算术平方根是整数，而非完全平方整数的平方根如果是有理数，那么一定是分数，所以要证明原命题，我们只需要证明不存在一个分数，它的平方是整数。</p>
<p>对于任意一个分数<img src="http://www.forkosh.com/mathtex.cgi?x=\frac{p}{q}" style="float:top;" border="0px" />，其中<img src="http://www.forkosh.com/mathtex.cgi?p,q" style="float:top;" border="0px" />是互质的整数且<img src="http://www.forkosh.com/mathtex.cgi?q\neq1" style="float:top;" border="0px" />。</p>
<p>考察它的平方<img src="http://www.forkosh.com/mathtex.cgi?x^2=\frac{p^2}{q^2}" style="float:top;" border="0px" />，若其为一个整数，必有<img src="http://www.forkosh.com/mathtex.cgi?q^2" style="float:top;" border="0px" />整除<img src="http://www.forkosh.com/mathtex.cgi?p^2" style="float:top;" border="0px" />，而这将与<img src="http://www.forkosh.com/mathtex.cgi?p,q" style="float:top;" border="0px" />互质矛盾，因为我们若对<img src="http://www.forkosh.com/mathtex.cgi?p,q" style="float:top;" border="0px" />分解质因数，由于其互质，所以不会有相同的素因子，所以<img src="http://www.forkosh.com/mathtex.cgi?p^2" style="float:top;" border="0px" />和<img src="http://www.forkosh.com/mathtex.cgi?q^2" style="float:top;" border="0px" /> 也不会有相同的素因子，所以<img src="http://www.forkosh.com/mathtex.cgi?p^2,q^2" style="float:top;" border="0px" />互质。</p>
<p>故<img src="http://www.forkosh.com/mathtex.cgi?x^2" style="float:top;" border="0px" />不可能为整数。</p>
<p>原命题得证。</p>
<p style='text-align:left'>&copy; 2012, <a href='http://aikilis.tk'>Aikilis</a>. 版权所有. 转载请注明出自<a href="http://aikilis.tk/">http://aikilis.tk/</a>.</p>

	Tags: <a href="http://aikilis.tk/tag/%e6%95%b0%e5%ad%a6%e5%88%86%e6%9e%90" title="数学分析" rel="tag">数学分析</a>, <a href="http://aikilis.tk/tag/%e6%95%b0%e8%ae%ba" title="数论" rel="tag">数论</a><br />
]]></content:encoded>
			<wfw:commentRss>http://aikilis.tk/1743.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>UVa 10061 &#8211; How many zeros and how many digits? &#124; 解题报告</title>
		<link>http://aikilis.tk/1738.html</link>
		<comments>http://aikilis.tk/1738.html#comments</comments>
		<pubDate>Fri, 06 Apr 2012 10:53:35 +0000</pubDate>
		<dc:creator>Aikilis</dc:creator>
				<category><![CDATA[数学与计算机科学]]></category>
		<category><![CDATA[UVa]]></category>
		<category><![CDATA[数论]]></category>
		<category><![CDATA[算法]]></category>
		<category><![CDATA[解题报告]]></category>

		<guid isPermaLink="false">http://aikilis.tk/1738.html</guid>
		<description><![CDATA[        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div>问题简述 给出十进制整数N和B （0&#60;=N&#60;=220，1&#60;B&#60;=800），求N!在B进制表示下的位数与末尾0的个数。 分析 一个数在进制下的位数等于： 考虑到，所以其位数可以分解为： 任意进制下阶乘末尾零的求法，与求十进制下N!末尾零的求法[1]是相似的。 在十进制下，一个数末尾的零对应于它可以被因数分解为多少个10，同样的，一个B进制数的末尾零个数对应于它可以被因数分解为多少个B。 现在对N!分解质因数： 再对B分解质因数： 现在只需要统计X,Y,Z,&#8230;中有几组X&#8217;,Y&#8217;,Z&#8217;,&#8230;，组数就是N!末尾0的个数。 代码 #include &#60;stdio.h&#62; #include &#60;math.h&#62; #define ESP (1e-8) #define N (1000) int zero(int n,int base); int digit(int n,int base); int main() { int n,base; while (EOF!=scanf("%d%d",&#38;n,&#38;base)) printf("%d %d\n",zero(n,base),digit(n,base)); return &#8230; <a href="http://aikilis.tk/1738.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div><h1>问题简述</h1>
<p>给出十进制整数N和B （0&lt;=N&lt;=2<sup>20</sup>，1&lt;B&lt;=800），求N!在B进制表示下的位数与末尾0的个数。</p>
<h1>分析</h1>
<p>一个数<img src="http://www.forkosh.com/mathtex.cgi?x" style="float:top;" border="0px" />在<img src="http://www.forkosh.com/mathtex.cgi?B" style="float:top;" border="0px" />进制下的位数等于：</p>
<blockquote><img src="http://www.forkosh.com/mathtex.cgi?1+\lfloor log_{B}x \rfloor" style="float:top;" border="0px" />
</blockquote>
<p>考虑到<img src="http://www.forkosh.com/mathtex.cgi?N!=1\cdot2\cdot3\cdot4\cdot\ldots\cdotN" style="float:top;" border="0px" />，所以其位数可以分解为：</p>
<blockquote><img src="http://www.forkosh.com/mathtex.cgi?1+\lfloor \sum_{i=1}^{N}{log_{B}i} \rfloor" style="float:top;" border="0px" />
</blockquote>
<p>任意进制下阶乘末尾零的求法，与求十进制下N!末尾零的求法<sup>[1]</sup>是相似的。</p>
<p>在十进制下，一个数末尾的零对应于它可以被因数分解为多少个10，同样的，一个B进制数的末尾零个数对应于它可以被因数分解为多少个B。</p>
<p>现在对N!分解质因数：</p>
<blockquote><img src="http://www.forkosh.com/mathtex.cgi?N!=2^{X}3^{Y}5^{Z}\ldots" style="float:top;" border="0px" />
</blockquote>
<p>再对B分解质因数：</p>
<blockquote><img src="http://www.forkosh.com/mathtex.cgi?B=2^{X\prime}3^{Y\prime}}5^{Z\prime}\ldots" style="float:top;" border="0px" />
</blockquote>
<p>现在只需要统计X,Y,Z,&#8230;中有几组X&#8217;,Y&#8217;,Z&#8217;,&#8230;，组数就是N!末尾0的个数。</p>
<h1>代码</h1>
<blockquote><pre>#include &lt;stdio.h&gt;
#include &lt;math.h&gt;
#define ESP (1e-8)
#define N (1000)
<span style="color: #0000ff">int</span> zero(<span style="color: #0000ff">int</span> n,<span style="color: #0000ff">int</span> base);
<span style="color: #0000ff">int</span> digit(<span style="color: #0000ff">int</span> n,<span style="color: #0000ff">int</span> base);
<span style="color: #0000ff">int</span> main()
{
	<span style="color: #0000ff">int</span> n,base;
	<span style="color: #0000ff">while</span> (EOF!=scanf("<span style="color: #8b0000">%d%d</span>",&amp;n,&amp;base)) printf("<span style="color: #8b0000">%d %d\n</span>",zero(n,base),digit(n,base));
	<span style="color: #0000ff">return</span> 0;
}
<span style="color: #0000ff">int</span> zero(<span style="color: #0000ff">int</span> n,<span style="color: #0000ff">int</span> base)
{
	<span style="color: #0000ff">int</span> fact[N],nFact=0,i=2,t=base;
	<span style="color: #0000ff">while</span> (i*i&lt;=t)
		<span style="color: #0000ff">if</span> (0==t%i)
		{
			fact[nFact++]=i;
			t/=i;
		}
		<span style="color: #0000ff">else</span> ++i;
	<span style="color: #0000ff">if</span> (t&gt;1) fact[nFact++]=t;
	<span style="color: #0000ff">int</span> uFact[N],cFact[N]={0},nUFact=0;
	<span style="color: #0000ff">for</span> (<span style="color: #0000ff">int</span> i=0;i&lt;nFact;++i)
		<span style="color: #0000ff">if</span> (i&amp;&amp;fact[i]==fact[i-1]) ++cFact[nUFact-1];
		<span style="color: #0000ff">else</span> uFact[nUFact]=fact[i],cFact[nUFact]=1,++nUFact;
	<span style="color: #0000ff">int</span> sum[N];
	<span style="color: #0000ff">for</span> (<span style="color: #0000ff">int</span> i=0;i&lt;nUFact;++i)
	{
		<span style="color: #0000ff">int</span> exp=uFact[i];
		sum[i]=0;
		<span style="color: #0000ff">while</span> (exp&lt;=n) {sum[i]+=n/exp;exp*=uFact[i];}
	}
	<span style="color: #0000ff">int</span> ans=sum[0]/cFact[0];
	<span style="color: #0000ff">for</span> (i=1;i&lt;nUFact;++i) <span style="color: #0000ff">if</span> (sum[i]/cFact[i]&lt;ans) ans=sum[i]/cFact[i];
	<span style="color: #0000ff">return</span> ans;
}
<span style="color: #0000ff">int</span> digit(<span style="color: #0000ff">int</span> n,<span style="color: #0000ff">int</span> base)
{
	<span style="color: #0000ff">double</span> sum=0;
	<span style="color: #0000ff">for</span> (<span style="color: #0000ff">int</span> i=1;i&lt;=n;++i) sum+=log(i)/log(base);
	<span style="color: #0000ff">return</span> 1+floor(ESP+sum);
}</pre>
</blockquote>
<h1>参考文献</h1>
<p>[1]<a href="http://aikilis.tk/?p=1719" target="_blank">Aikilis:阶乘末尾有多少个零.</a></p>
<p style='text-align:left'>&copy; 2012, <a href='http://aikilis.tk'>Aikilis</a>. 版权所有. 转载请注明出自<a href="http://aikilis.tk/">http://aikilis.tk/</a>.</p>

	Tags: <a href="http://aikilis.tk/tag/uva" title="UVa" rel="tag">UVa</a>, <a href="http://aikilis.tk/tag/%e6%95%b0%e8%ae%ba" title="数论" rel="tag">数论</a>, <a href="http://aikilis.tk/tag/%e7%ae%97%e6%b3%95" title="算法" rel="tag">算法</a>, <a href="http://aikilis.tk/tag/%e8%a7%a3%e9%a2%98%e6%8a%a5%e5%91%8a" title="解题报告" rel="tag">解题报告</a><br />
]]></content:encoded>
			<wfw:commentRss>http://aikilis.tk/1738.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>UVa 550 &#8211; Multiplying by Rotation &#124; 解题报告</title>
		<link>http://aikilis.tk/1733.html</link>
		<comments>http://aikilis.tk/1733.html#comments</comments>
		<pubDate>Thu, 05 Apr 2012 15:19:30 +0000</pubDate>
		<dc:creator>Aikilis</dc:creator>
				<category><![CDATA[数学与计算机科学]]></category>
		<category><![CDATA[UVa]]></category>
		<category><![CDATA[数论]]></category>
		<category><![CDATA[算法]]></category>
		<category><![CDATA[解题报告]]></category>

		<guid isPermaLink="false">http://aikilis.tk/1733.html</guid>
		<description><![CDATA[        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div>问题简述 一些数在某些进制下可能具有“轮换乘法”性质，这是说这个数与某乘数相乘的结果等于将这个数的末位移动到首位。 下面是两个例子： 179487 * 4 = 717948，这是十进制下的例子。 17 * 4 = 71 ，这是九进制下的例子。 现在给出进制B，乘数N在B进制下的末尾D，以及另一个乘数M （0&#60;=M&#60;B），求满足“轮换乘法”性质的乘数N的最小位数。（B进制下） 分析 假设我们的乘数有n位，从低位到高位分别为d[0],d[1],&#8230;,d[n-1]，我们让它与m相乘，结果如下表所示： d[n-1] d[n-2] &#8230; d[2] d[1] d[0] &#160; &#160; &#160; &#160; &#160; m (md[n-1]+&#8230;)%B (md[n-2]+&#8230;)%B &#8230; (md[2]+(md[1]+md[0]/B)/B)%B (md[1]+md[0]/B)%B md[0]%B 注意到，如果令f[0]=md[0]，f[1]=md[1]+f[0]/B，f[2]=md[2]+f[1]/B，&#8230;，f[i]=md[i]+f[i-1]/B，&#8230;，f[n-1]=md[n-1]+f[n-2]/B，那么乘积从低到高的第i位就为f[i]%B。 现在考虑，如果d[n-1]，d[n-2]，&#8230;，d[0]组成满足“轮换乘法”性质的数，那么它与m相乘将呈现下表所示的结果： d[n-1] d[n-2] &#8230; <a href="http://aikilis.tk/1733.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div><h1>问题简述</h1>
<p>一些数在某些进制下可能具有“轮换乘法”性质，这是说这个数与某乘数相乘的结果等于将这个数的末位移动到首位。</p>
<p>下面是两个例子：</p>
<p>179487 * 4 = 717948，这是十进制下的例子。</p>
<p>17 * 4 = 71 ，这是九进制下的例子。</p>
<p>现在给出进制B，乘数N在B进制下的末尾D，以及另一个乘数M （0&lt;=M&lt;B），求满足“轮换乘法”性质的乘数N的最小位数。（B进制下）</p>
<h1>分析</h1>
<p>假设我们的乘数有n位，从低位到高位分别为d[0],d[1],&#8230;,d[n-1]，我们让它与m相乘，结果如下表所示：</p>
<table border="1" cellspacing="0" cellpadding="2" width="735">
<tbody>
<tr>
<td valign="top" width="128">d[n-1]</td>
<td valign="top" width="120">d[n-2]</td>
<td valign="top" width="24">&#8230;</td>
<td valign="top" width="236">d[2]</td>
<td valign="top" width="156">d[1]</td>
<td valign="top" width="69">d[0]</td>
</tr>
<tr>
<td valign="top" width="128">&nbsp;</td>
<td valign="top" width="120">&nbsp;</td>
<td valign="top" width="24">&nbsp;</td>
<td valign="top" width="236">&nbsp;</td>
<td valign="top" width="156">&nbsp;</td>
<td valign="top" width="69">m</td>
</tr>
<tr>
<td valign="top" width="128">(md[n-1]+&#8230;)%B</td>
<td valign="top" width="120">(md[n-2]+&#8230;)%B</td>
<td valign="top" width="24">&#8230;</td>
<td valign="top" width="236">(md[2]+(md[1]+md[0]/B)/B)%B</td>
<td valign="top" width="156">(md[1]+md[0]/B)%B</td>
<td valign="top" width="69">md[0]%B</td>
</tr>
</tbody>
</table>
<h1></h1>
<p>注意到，如果令f[0]=md[0]，f[1]=md[1]+f[0]/B，f[2]=md[2]+f[1]/B，&#8230;，f[i]=md[i]+f[i-1]/B，&#8230;，f[n-1]=md[n-1]+f[n-2]/B，那么乘积从低到高的第i位就为f[i]%B。</p>
<p>现在考虑，如果d[n-1]，d[n-2]，&#8230;，d[0]组成满足“轮换乘法”性质的数，那么它与m相乘将呈现下表所示的结果：</p>
<table border="1" cellspacing="0" cellpadding="2" width="400">
<tbody>
<tr>
<td valign="top" width="66">d[n-1]</td>
<td valign="top" width="66">d[n-2]</td>
<td valign="top" width="66">&#8230;</td>
<td valign="top" width="66">d[2]</td>
<td valign="top" width="66">d[1]</td>
<td valign="top" width="66">d[0]</td>
</tr>
<tr>
<td valign="top" width="66">&nbsp;</td>
<td valign="top" width="66">&nbsp;</td>
<td valign="top" width="66">&nbsp;</td>
<td valign="top" width="66">&nbsp;</td>
<td valign="top" width="66">&nbsp;</td>
<td valign="top" width="66">m</td>
</tr>
<tr>
<td valign="top" width="66">d[0]</td>
<td valign="top" width="66">d[n-1]</td>
<td valign="top" width="66">&#8230;</td>
<td valign="top" width="66">d[3]</td>
<td valign="top" width="66">d[2]</td>
<td valign="top" width="66">d[1]</td>
</tr>
</tbody>
</table>
<p>现在我们将两个表得到的结果进行对比，得到：</p>
<blockquote><p>d[1]=f[0]%B</p>
<p>d[2]=f[1]%B</p>
<p>d[3]=f[2]%B</p>
<p>&#8230;</p>
<p>d[n-1]=f[n-2]%B</p>
<p>d[0]=f[n-1]%B<font color="#ff0000">=f[n-1]</font></p>
</blockquote>
<p>注意到这其实是递推关系：</p>
<blockquote><p>d[i]=f[i-1]%B</p>
<p>f[i]=md[i]+f[i-1]/B</p>
</blockquote>
<p>现在我们只需按这个关系计算f[]数组和d[]数组，直到发现f[n-1]=d[0]时，n便是所求长度。</p>
<h1>代码</h1>
<blockquote><pre>#include &lt;stdio.h&gt;
#define N (10000)
<span style="color: #0000ff">int</span> f[N]={0};
<span style="color: #0000ff">int</span> base,digit[N],m;
<span style="color: #0000ff">int</span> main()
{
	<span style="color: #0000ff">while</span> (EOF!=scanf("<span style="color: #8b0000">%d%d%d</span>",&amp;base,digit,&amp;m))
	{
		f[0]=m*digit[0];
		<span style="color: #0000ff">if</span> (digit[0]==f[0]) {puts("<span style="color: #8b0000">1</span>");<span style="color: #0000ff">continue</span>;}
		<span style="color: #0000ff">for</span> (<span style="color: #0000ff">int</span> i=1;i&lt;N;++i)
		{
			digit[i]=f[i-1]%base;
			f[i]=m*digit[i]+f[i-1]/base;
			<span style="color: #0000ff">if</span> (digit[0]==f[i])
			{
				printf("<span style="color: #8b0000">%d\n</span>",i+1);
				<span style="color: #0000ff">break</span>;
			}
		}
	}
	<span style="color: #0000ff">return</span> 0;
}</pre>
</blockquote>
<p style='text-align:left'>&copy; 2012, <a href='http://aikilis.tk'>Aikilis</a>. 版权所有. 转载请注明出自<a href="http://aikilis.tk/">http://aikilis.tk/</a>.</p>

	Tags: <a href="http://aikilis.tk/tag/uva" title="UVa" rel="tag">UVa</a>, <a href="http://aikilis.tk/tag/%e6%95%b0%e8%ae%ba" title="数论" rel="tag">数论</a>, <a href="http://aikilis.tk/tag/%e7%ae%97%e6%b3%95" title="算法" rel="tag">算法</a>, <a href="http://aikilis.tk/tag/%e8%a7%a3%e9%a2%98%e6%8a%a5%e5%91%8a" title="解题报告" rel="tag">解题报告</a><br />
]]></content:encoded>
			<wfw:commentRss>http://aikilis.tk/1733.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>UVa 548 &#8211; Just the Facts &#124; 解题报告</title>
		<link>http://aikilis.tk/1721.html</link>
		<comments>http://aikilis.tk/1721.html#comments</comments>
		<pubDate>Thu, 05 Apr 2012 08:47:56 +0000</pubDate>
		<dc:creator>Aikilis</dc:creator>
				<category><![CDATA[数学与计算机科学]]></category>
		<category><![CDATA[UVa]]></category>
		<category><![CDATA[数论]]></category>
		<category><![CDATA[算法]]></category>
		<category><![CDATA[解题报告]]></category>

		<guid isPermaLink="false">http://aikilis.tk/1721.html</guid>
		<description><![CDATA[        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div>问题简述 给出一组N(0&#60;=N&#60;=10000)，求N!的最右边的非零数字。比如5!=120，那么答案就为2。 分析 我们用f[n]保存n!的末几位非零数，然后进行递推求解。先看看只保存一位是否可以，要通过f[n-1]求解n，如果nf[n-1]末尾没有0，那么显然f[n]就等于nf[n-1]的最末位，这是因为乘积的最末位只由乘数的最末位决定，但是当nf[n-1]有一个尾0的时候就行不通了，因为要得知f[n]，也就是要得知n!的最末非零数，我们需要知道乘数的末两位，而f[n-1]只保存了末一位。如果f[n]保存末两位，则当nf[n-1]有两个尾0时便行不通了，而由于n最大为10000，由文献[1]可知nf[n-1]最多有5个尾0，所以f[n]应当保存n!的最末6位非零数。 然后递推计算就可以了。 代码 #include &#60;stdio.h&#62; #define N (10000) int f[N+1]={1}; int main() { for (int i=1;i&#60;=N;++i) { long long t=f[i-1]*(long long)i; while (t%10==0) t/=10; f[i]=t%1000000; } int n; while (EOF!=scanf("%d",&#38;n)) printf("%5d -&#62; %d\n",n,f[n]%10); return 0; } 参考文献 &#8230; <a href="http://aikilis.tk/1721.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div><h1>问题简述</h1>
<p>给出一组N(0&lt;=N&lt;=10000)，求N!的最右边的非零数字。比如5!=120，那么答案就为2。</p>
<h1>分析</h1>
<p>我们用f[n]保存n!的末几位非零数，然后进行递推求解。先看看只保存一位是否可以，要通过f[n-1]求解n，如果nf[n-1]末尾没有0，那么显然f[n]就等于nf[n-1]的最末位，这是因为乘积的最末位只由乘数的最末位决定，但是当nf[n-1]有一个尾0的时候就行不通了，因为要得知f[n]，也就是要得知n!的最末非零数，我们需要知道乘数的末两位，而f[n-1]只保存了末一位。如果f[n]保存末两位，则当nf[n-1]有两个尾0时便行不通了，而由于n最大为10000，由文献<sup>[1]</sup>可知nf[n-1]最多有5个尾0，所以f[n]应当保存n!的最末6位非零数。</p>
<p>然后递推计算就可以了。</p>
<h1>代码</h1>
<blockquote><pre>#include &lt;stdio.h&gt;
#define N (10000)
<span style="color: #0000ff">int</span> f[N+1]={1};
<span style="color: #0000ff">int</span> main()
{
	<span style="color: #0000ff">for</span> (<span style="color: #0000ff">int</span> i=1;i&lt;=N;++i)
	{
		<span style="color: #0000ff">long</span> <span style="color: #0000ff">long</span> t=f[i-1]*(<span style="color: #0000ff">long</span> <span style="color: #0000ff">long</span>)i;
		<span style="color: #0000ff">while</span> (t%10==0) t/=10;
		f[i]=t%1000000;
	}
	<span style="color: #0000ff">int</span> n;
	<span style="color: #0000ff">while</span> (EOF!=scanf("<span style="color: #8b0000">%d</span>",&amp;n)) printf("<span style="color: #8b0000">%5d -&gt; %d\n</span>",n,f[n]%10);
	<span style="color: #0000ff">return</span> 0;
}</pre>
</blockquote>
<h1>参考文献</h1>
<p>[1]<a href="http://aikilis.tk/?p=1719" target="_blank">Aikilis:阶乘末尾有多少个零.</a></p>
<p style='text-align:left'>&copy; 2012, <a href='http://aikilis.tk'>Aikilis</a>. 版权所有. 转载请注明出自<a href="http://aikilis.tk/">http://aikilis.tk/</a>.</p>

	Tags: <a href="http://aikilis.tk/tag/uva" title="UVa" rel="tag">UVa</a>, <a href="http://aikilis.tk/tag/%e6%95%b0%e8%ae%ba" title="数论" rel="tag">数论</a>, <a href="http://aikilis.tk/tag/%e7%ae%97%e6%b3%95" title="算法" rel="tag">算法</a>, <a href="http://aikilis.tk/tag/%e8%a7%a3%e9%a2%98%e6%8a%a5%e5%91%8a" title="解题报告" rel="tag">解题报告</a><br />
]]></content:encoded>
			<wfw:commentRss>http://aikilis.tk/1721.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>阶乘末尾有多少个零</title>
		<link>http://aikilis.tk/1719.html</link>
		<comments>http://aikilis.tk/1719.html#comments</comments>
		<pubDate>Thu, 05 Apr 2012 07:46:16 +0000</pubDate>
		<dc:creator>Aikilis</dc:creator>
				<category><![CDATA[数学与计算机科学]]></category>
		<category><![CDATA[数论]]></category>

		<guid isPermaLink="false">http://aikilis.tk/1719.html</guid>
		<description><![CDATA[        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div>计算N!的末尾有多少个0是一个经典的问题，其解法蕴含了数论问题中的一种基本思路。 我们将N!做质因子分解： N!中的末尾0个数实际就是乘积为10的个数，而10=2*5，所以末尾0个数就是N!分解式中2和5的对数，我们知道偶数的个数远多于5的倍数的个数，所以2肯定是够用的，所以末尾0个数就等于分解式中5的个数。 所以： &#169; 2012, Aikilis. 版权所有. 转载请注明出自http://aikilis.tk/. Tags: 数论]]></description>
			<content:encoded><![CDATA[        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div><p>计算N!的末尾有多少个0是一个经典的问题，其解法蕴含了数论问题中的一种基本思路。</p>
<p>我们将N!做质因子分解：<img src="http://www.forkosh.com/mathtex.cgi?N!=2^{X}3^{Y}5^{Z}\ldots" style="float:top;" border="0px" /></p>
<p>N!中的末尾0个数实际就是乘积为10的个数，而10=2*5，所以末尾0个数就是N!分解式中2和5的对数，我们知道偶数的个数远多于5的倍数的个数，所以2肯定是够用的，所以末尾0个数就等于分解式中5的个数。</p>
<p>所以：</p>
<blockquote><img src="http://www.forkosh.com/mathtex.cgi?ZERO(N!)=\lfloor\frac{N}{5}\rfloor+\lfloor\frac{N}{25}\rfloor+\lfloor\frac{N}{125}\rfloor+\ldots" style="float:top;" border="0px" />
</blockquote>
<p style='text-align:left'>&copy; 2012, <a href='http://aikilis.tk'>Aikilis</a>. 版权所有. 转载请注明出自<a href="http://aikilis.tk/">http://aikilis.tk/</a>.</p>

	Tags: <a href="http://aikilis.tk/tag/%e6%95%b0%e8%ae%ba" title="数论" rel="tag">数论</a><br />
]]></content:encoded>
			<wfw:commentRss>http://aikilis.tk/1719.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>UVa 350 &#8211; Pseudo-Random Numbers &#124; 解题报告</title>
		<link>http://aikilis.tk/1709.html</link>
		<comments>http://aikilis.tk/1709.html#comments</comments>
		<pubDate>Tue, 03 Apr 2012 14:58:16 +0000</pubDate>
		<dc:creator>Aikilis</dc:creator>
				<category><![CDATA[数学与计算机科学]]></category>
		<category><![CDATA[UVa]]></category>
		<category><![CDATA[数论]]></category>
		<category><![CDATA[算法]]></category>
		<category><![CDATA[解题报告]]></category>

		<guid isPermaLink="false">http://aikilis.tk/1709.html</guid>
		<description><![CDATA[        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div>问题简述 给出Z,I,M和L，每个都最大是一个四位数。现在不断执行L=(ZL+I) MOD M，我们知道从某一次开始会得到以前出现过的数，这样就形成了一个环，问这个环的长度是多少。 分析 特别需要注意的是，环不一定是从第一个L开始的。 用c表示已经生成了多少个数，用一个标记数组map[i]来记录i是否出现过，用len[i]记录i第一次出现时产生了多少个不同的数（包括i ),然后不断生成L，直到发现map[L]为真，也就是L已经出现过，这时c-len[L]+1就是环的长度。 代码 #include &#60;stdio.h&#62; #include &#60;math.h&#62; #define N (10000) int main() { int l,z,i,m,iCase=0; while (scanf("%d%d%d%d",&#38;z,&#38;i,&#38;m,&#38;l),z&#124;&#124;i&#124;&#124;m&#124;&#124;l) { int map[N]={0},c=0,len[N]={0}; while (!map[l]) { ++c; map[l]=1; len[l]=c; l=(z*l+i)%m; } printf("Case %d: %d\n",++iCase,c-len[l]+1); } return 0; &#8230; <a href="http://aikilis.tk/1709.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div><h1>问题简述</h1>
<p>给出Z,I,M和L，每个都最大是一个四位数。现在不断执行L=(ZL+I) MOD M，我们知道从某一次开始会得到以前出现过的数，这样就形成了一个环，问这个环的长度是多少。</p>
<h1>分析</h1>
<p>特别需要注意的是，环不一定是从第一个L开始的。</p>
<p>用c表示已经生成了多少个数，用一个标记数组map[i]来记录i是否出现过，用len[i]记录i第一次出现时产生了多少个不同的数（包括i ),然后不断生成L，直到发现map[L]为真，也就是L已经出现过，这时c-len[L]+1就是环的长度。</p>
<h1>代码</h1>
<blockquote><pre>#include &lt;stdio.h&gt;
#include &lt;math.h&gt;
#define N (10000)
<span style="color: #0000ff">int</span> main()
{
	<span style="color: #0000ff">int</span> l,z,i,m,iCase=0;
	<span style="color: #0000ff">while</span> (scanf("<span style="color: #8b0000">%d%d%d%d</span>",&amp;z,&amp;i,&amp;m,&amp;l),z||i||m||l)
	{
		<span style="color: #0000ff">int</span> map[N]={0},c=0,len[N]={0};
		<span style="color: #0000ff">while</span> (!map[l])
		{
			++c;
			map[l]=1;
			len[l]=c;
			l=(z*l+i)%m;
		}
		printf("<span style="color: #8b0000">Case %d: %d\n</span>",++iCase,c-len[l]+1);
	}
	<span style="color: #0000ff">return</span> 0;
}</pre>
</blockquote>
<p style='text-align:left'>&copy; 2012, <a href='http://aikilis.tk'>Aikilis</a>. 版权所有. 转载请注明出自<a href="http://aikilis.tk/">http://aikilis.tk/</a>.</p>

	Tags: <a href="http://aikilis.tk/tag/uva" title="UVa" rel="tag">UVa</a>, <a href="http://aikilis.tk/tag/%e6%95%b0%e8%ae%ba" title="数论" rel="tag">数论</a>, <a href="http://aikilis.tk/tag/%e7%ae%97%e6%b3%95" title="算法" rel="tag">算法</a>, <a href="http://aikilis.tk/tag/%e8%a7%a3%e9%a2%98%e6%8a%a5%e5%91%8a" title="解题报告" rel="tag">解题报告</a><br />
]]></content:encoded>
			<wfw:commentRss>http://aikilis.tk/1709.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

