﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-yx-随笔分类-数学题</title><link>http://www.cppblog.com/csu-yx-2013/category/19101.html</link><description>Algorithm Study And So On</description><language>zh-cn</language><lastBuildDate>Fri, 13 Sep 2013 01:08:25 GMT</lastBuildDate><pubDate>Fri, 13 Sep 2013 01:08:25 GMT</pubDate><ttl>60</ttl><item><title>poj 2065 SETI</title><link>http://www.cppblog.com/csu-yx-2013/archive/2012/08/06/186469.html</link><dc:creator>yx</dc:creator><author>yx</author><pubDate>Mon, 06 Aug 2012 08:01:00 GMT</pubDate><guid>http://www.cppblog.com/csu-yx-2013/archive/2012/08/06/186469.html</guid><wfw:comment>http://www.cppblog.com/csu-yx-2013/comments/186469.html</wfw:comment><comments>http://www.cppblog.com/csu-yx-2013/archive/2012/08/06/186469.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/csu-yx-2013/comments/commentRss/186469.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/csu-yx-2013/services/trackbacks/186469.html</trackback:ping><description><![CDATA[&nbsp; &nbsp;题意比较纠结，搜索了把题意。<br /><div>&nbsp;&nbsp;&nbsp;给你一个素数P(P&lt;=30000)和一串长为n的字符串str[]。字母'*'代表0，字母a-z分别代表1-26，这n个字符所代表的数字分别代表<br />f(1)、f(2)....f(n)。定义:&nbsp;f (k) = &#8721;<sub>0&lt;=i&lt;=n-1</sub>a<sub>i</sub>k<sup>i</sup>&nbsp;(mod p) (1&lt;=k&lt;=n,0&lt;=ai&lt;P)，求a0、a1.....an-1。题目保证肯定有唯一解。<br />&nbsp; &nbsp;解题思路：高斯消元。根据上面的公式显然可以列出有n个未知数的n个方程式：</div><div><div>&nbsp;&nbsp;&nbsp;a0*1^0 + a1*1^1+a2*1^2+........+an-1*1^(n-1) = f(1)</div><div>&nbsp;&nbsp;&nbsp;a0*2^0 + a1*2^1+a2*2^2+........+an-1*2^(n-1) = f(2)</div><div>&nbsp;&nbsp;&nbsp;..............</div><div>&nbsp;&nbsp;&nbsp;a0*n^0 + a1*n^1+a2*n^2+........+an-1*n^(n-1) = f(n)</div><div>&nbsp;&nbsp;&nbsp;然后采用高斯消元法来解上面的方程组即可。<br />&nbsp; &nbsp;典型的高斯消元题，只是多了个modP，因此计算过程中可能需要扩展欧几里德算法。<br /><br />&nbsp; &nbsp;说下所谓的高斯消元的思路，其实可以参看维基百科，<br /><div><a href="http://zh.wikipedia.org/wiki/%E9%AB%98%E6%96%AF%E6%B6%88%E5%8E%BB%E6%B3%95">http://zh.wikipedia.org/wiki/%E9%AB%98%E6%96%AF%E6%B6%88%E5%8E%BB%E6%B3%95</a>，大致过程是一直消变量。<br />比如刚开始，消第一个变量，消完之后只让第一个方程含有第一个变量，然后消第二个变量，消完之后只让第二个方程含第二个变量，以此<br />下去让最后的方程含最后一个变量，而且最后一个方程中对于前N-1个变量的系数都是0，这样就能解出这N个变量了。<br />&nbsp; &nbsp;关于自由元指的是这个变量可以取任何值，得出这样的结论是在消变量的过程中发现该变量的在第row个方程到第N方程中的系数都是0了，<br />所以可以取任何值。判断无解的方式是，第row+1到第N个方程在高斯消元之后所有的系数必定是0，所以方程的值也必须是0。<br />&nbsp; &nbsp;求方程的解得过程是从N个解开始逆推，第N-1个方程也就包含2个变量了，第N个变量和第N-1个变量，以此下去，就可以解出方程组了。<br />&nbsp; &nbsp;具体的可以参照维基百科和代码仔细分析。还有演算法笔记上也有高斯消元的解释。<br /><br />&nbsp; &nbsp;代码如下：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;&lt;stdio.h&gt;<br />#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>.h&gt;<br />#include&nbsp;&lt;algorithm&gt;<br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><span style="color: #0000FF; ">#define</span>&nbsp;MAX&nbsp;(70&nbsp;+&nbsp;10)<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;nMatrix[MAX][MAX];<br /><span style="color: #0000FF; ">int</span>&nbsp;nAns[MAX];<br /><span style="color: #0000FF; ">void</span>&nbsp;InitMatrix(<span style="color: #0000FF; ">char</span>*&nbsp;szStr,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nN,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nP)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;memset(nMatrix,&nbsp;0,&nbsp;<span style="color: #0000FF; ">sizeof</span>(nMatrix));<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;nN;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nMatrix[i][nN]&nbsp;=&nbsp;(szStr[i]&nbsp;==&nbsp;'*'&nbsp;?&nbsp;0&nbsp;:&nbsp;szStr[i]&nbsp;-&nbsp;'a'&nbsp;+&nbsp;1);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;nN;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nTemp&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;&nbsp;nN;&nbsp;++j)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nMatrix[i][j]&nbsp;=&nbsp;nTemp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nTemp&nbsp;=&nbsp;(nTemp&nbsp;*&nbsp;(i&nbsp;+&nbsp;1))&nbsp;%&nbsp;nP;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;egcd(<span style="color: #0000FF; ">int</span>&nbsp;nA,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nB,&nbsp;<span style="color: #0000FF; ">int</span>&amp;&nbsp;nX,&nbsp;<span style="color: #0000FF; ">int</span>&amp;&nbsp;nY)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(nA&nbsp;&lt;&nbsp;nB)swap(nA,&nbsp;nB);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(nB&nbsp;==&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nX&nbsp;=&nbsp;1,&nbsp;nY&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;nA;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nRet&nbsp;=&nbsp;egcd(nB,&nbsp;nA&nbsp;%&nbsp;nB,&nbsp;nX,&nbsp;nY);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nT&nbsp;=&nbsp;nX;<br />&nbsp;&nbsp;&nbsp;&nbsp;nX&nbsp;=&nbsp;nY;<br />&nbsp;&nbsp;&nbsp;&nbsp;nY&nbsp;=&nbsp;nT&nbsp;-&nbsp;(nA&nbsp;/&nbsp;nB)&nbsp;*&nbsp;nY;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;nRet;<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;Gauss(<span style="color: #0000FF; ">int</span>&nbsp;nN,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nP)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nR,&nbsp;nC;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(nR&nbsp;=&nbsp;nC&nbsp;=&nbsp;0;&nbsp;nR&nbsp;&lt;&nbsp;nN&nbsp;&amp;&amp;&nbsp;nC&nbsp;&lt;&nbsp;nN;&nbsp;++nR,&nbsp;++nC)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(nMatrix[nR][nC]&nbsp;==&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;nR&nbsp;+&nbsp;1;&nbsp;i&nbsp;&lt;&nbsp;nN;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(nMatrix[i][nC])<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;nC;&nbsp;j&nbsp;&lt;=&nbsp;nN;&nbsp;++j)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;swap(nMatrix[nR][j],&nbsp;nMatrix[i][j]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(nMatrix[nR][nC]&nbsp;==&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nR--;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">自由元</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">continue</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nA&nbsp;=&nbsp;nMatrix[nR][nC];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;nR&nbsp;+&nbsp;1;&nbsp;i&nbsp;&lt;&nbsp;nN;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(nMatrix[i][nC])<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nB&nbsp;=&nbsp;nMatrix[i][nC];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;nC;&nbsp;j&nbsp;&lt;=&nbsp;nN;&nbsp;++j)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nMatrix[i][j]&nbsp;=&nbsp;(nMatrix[i][j]&nbsp;*&nbsp;nA&nbsp;-&nbsp;nMatrix[nR][j]&nbsp;*&nbsp;nB)&nbsp;%&nbsp;nP;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;nR;&nbsp;i&nbsp;&lt;&nbsp;nN;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(nMatrix[i][nN])<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;-1;<span style="color: #008000; ">//</span><span style="color: #008000; ">无解</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nX,&nbsp;nY;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;nN&nbsp;-&nbsp;1;&nbsp;i&nbsp;&gt;=&nbsp;0;&nbsp;i--)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nSum&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;i&nbsp;+&nbsp;1;&nbsp;j&nbsp;&lt;&nbsp;nN;&nbsp;++j)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nSum&nbsp;=&nbsp;(nSum&nbsp;+&nbsp;nMatrix[i][j]&nbsp;*&nbsp;nAns[j])&nbsp;%&nbsp;nP;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nSum&nbsp;=&nbsp;(nMatrix[i][nN]&nbsp;-&nbsp;nSum&nbsp;+&nbsp;nP&nbsp;*&nbsp;nP)&nbsp;%&nbsp;nP;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;egcd(nP,&nbsp;(nMatrix[i][i]&nbsp;+&nbsp;nP)&nbsp;%&nbsp;nP,&nbsp;nX,&nbsp;nY);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nY&nbsp;=&nbsp;(nY&nbsp;+&nbsp;nP)&nbsp;%&nbsp;nP;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nAns[i]&nbsp;=&nbsp;(nY&nbsp;*&nbsp;nSum&nbsp;+&nbsp;nP)&nbsp;%&nbsp;nP;<span style="color: #008000; ">//</span><span style="color: #008000; ">第i个解</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;1&nbsp;&lt;&lt;&nbsp;(nN&nbsp;-&nbsp;nR);<span style="color: #008000; ">//</span><span style="color: #008000; ">返回解的个数,本题有唯一解</span><span style="color: #008000; "><br /></span>}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nT;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d",&nbsp;&amp;nT);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(nT--)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nP;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nN;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;szStr[MAX];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d%s",&nbsp;&amp;nP,&nbsp;szStr);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nN&nbsp;=&nbsp;strlen(szStr);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitMatrix(szStr,&nbsp;nN,&nbsp;nP);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Gauss(nN,&nbsp;nP);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;nN;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d%s",&nbsp;nAns[i],&nbsp;i&nbsp;==&nbsp;nN&nbsp;-&nbsp;1&nbsp;?&nbsp;"\n"&nbsp;:&nbsp;"&nbsp;");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div>&nbsp;&nbsp;&nbsp;</div></div></div><img src ="http://www.cppblog.com/csu-yx-2013/aggbug/186469.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/csu-yx-2013/" target="_blank">yx</a> 2012-08-06 16:01 <a href="http://www.cppblog.com/csu-yx-2013/archive/2012/08/06/186469.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>uva 10392 - Factoring Large Numbers</title><link>http://www.cppblog.com/csu-yx-2013/archive/2012/08/01/185896.html</link><dc:creator>yx</dc:creator><author>yx</author><pubDate>Wed, 01 Aug 2012 07:51:00 GMT</pubDate><guid>http://www.cppblog.com/csu-yx-2013/archive/2012/08/01/185896.html</guid><wfw:comment>http://www.cppblog.com/csu-yx-2013/comments/185896.html</wfw:comment><comments>http://www.cppblog.com/csu-yx-2013/archive/2012/08/01/185896.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/csu-yx-2013/comments/commentRss/185896.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/csu-yx-2013/services/trackbacks/185896.html</trackback:ping><description><![CDATA[&nbsp; &nbsp;此题的意思是分解大数字，数字的范围是Longlong级别的，好像不能暴力的样子。但是，题目给出了个条件，最多只有一个因<br />子的大小超过1000000。哈哈，这就是暴点啊。既然，如此直接枚举1000000以内的因子就行了，剩余的部分如果大于10的6次<br />肯定是N的因子了，就不用暴力了。如果小于10的6次肯定是1啦，因为2-1000000的因子都被处理了啊。<br />&nbsp; &nbsp;这样这个题就不会超时了。确实，暴力是需要技巧的。还要注意uva上要用%lld输入。<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;&lt;stdio.h&gt;<br />#include&nbsp;&lt;math.h&gt;<br />typedef&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;LL;<br /><span style="color: #0000FF; ">#define</span>&nbsp;MAX&nbsp;(6000000)<br /><span style="color: #0000FF; ">bool</span>&nbsp;bPrime[MAX];<br /><span style="color: #0000FF; ">int</span>&nbsp;nPrime[MAX];<br /><span style="color: #0000FF; ">int</span>&nbsp;nNum;<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;InitPrime()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;LL&nbsp;nMax&nbsp;=&nbsp;sqrt(MAX)&nbsp;+&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;bPrime[0]&nbsp;=&nbsp;bPrime[1]&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;2;&nbsp;i&nbsp;&lt;=&nbsp;nMax;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(!bPrime[i])<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;2&nbsp;*&nbsp;i;&nbsp;j&nbsp;&lt;&nbsp;MAX;&nbsp;j&nbsp;+=&nbsp;i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bPrime[j]&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;2;&nbsp;i&nbsp;&lt;&nbsp;MAX;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(!bPrime[i])<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nPrime[nNum++]&nbsp;=&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}<br /><br /><span style="color: #0000FF; ">bool</span>&nbsp;IsPrime(LL&nbsp;nN)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(nN&nbsp;&lt;&nbsp;MAX)&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;!bPrime[nN];<br />&nbsp;&nbsp;&nbsp;&nbsp;LL&nbsp;nMax&nbsp;=&nbsp;sqrt((<span style="color: #0000FF; ">double</span>)nN)&nbsp;+&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(LL&nbsp;j&nbsp;=&nbsp;0,&nbsp;i&nbsp;=&nbsp;nPrime[j];&nbsp;i&nbsp;&lt;=&nbsp;nMax;&nbsp;++j,&nbsp;i&nbsp;=&nbsp;nPrime[j])<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(nN&nbsp;%&nbsp;i&nbsp;==&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;LL&nbsp;nN;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;InitPrime();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(scanf("%lld",&nbsp;&amp;nN),&nbsp;nN&nbsp;&gt;=&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(nN&nbsp;&lt;=&nbsp;2)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%-lld\n\n",&nbsp;nN);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">continue</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nMax&nbsp;=&nbsp;sqrt((<span style="color: #0000FF; ">double</span>)nN)+&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(LL&nbsp;i&nbsp;=&nbsp;2;&nbsp;i&nbsp;&lt;=&nbsp;1000000&nbsp;&amp;&amp;&nbsp;i&nbsp;&lt;=&nbsp;nMax;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(nN&nbsp;%&nbsp;i&nbsp;==&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("&nbsp;&nbsp;&nbsp;&nbsp;%-lld\n",&nbsp;i);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nN&nbsp;/=&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(nN&nbsp;&lt;&nbsp;6000000&nbsp;&amp;&amp;&nbsp;IsPrime(nN))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(nN&nbsp;!=&nbsp;1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("&nbsp;&nbsp;&nbsp;&nbsp;%-lld\n",&nbsp;nN);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><img src ="http://www.cppblog.com/csu-yx-2013/aggbug/185896.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/csu-yx-2013/" target="_blank">yx</a> 2012-08-01 15:51 <a href="http://www.cppblog.com/csu-yx-2013/archive/2012/08/01/185896.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>poj 1401 Factorial</title><link>http://www.cppblog.com/csu-yx-2013/archive/2012/07/27/185327.html</link><dc:creator>yx</dc:creator><author>yx</author><pubDate>Fri, 27 Jul 2012 07:05:00 GMT</pubDate><guid>http://www.cppblog.com/csu-yx-2013/archive/2012/07/27/185327.html</guid><wfw:comment>http://www.cppblog.com/csu-yx-2013/comments/185327.html</wfw:comment><comments>http://www.cppblog.com/csu-yx-2013/archive/2012/07/27/185327.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/csu-yx-2013/comments/commentRss/185327.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/csu-yx-2013/services/trackbacks/185327.html</trackback:ping><description><![CDATA[&nbsp; &nbsp;这个题目是求N！后面有多少个0，注意N可能最大到10的9次。哈哈，直接枚举1-N有多少个2和5的因子，然后取小的值肯定会超时的。<br />但是，我还是试了下，果断超时了。<br />&nbsp; &nbsp;那就只有想数学结论了，果断想到1-N中能被2整除的数字有N / 2。哈哈，再往后思考下，发现1-N中能被4整除的数字有N / 4个，再往后<br />就是N / 8，一直到N 除以2的某个次方为0为止，那么把所有的值加起来就是2的因子的个数了。求5的因子的个数也是这样的方法了。<br />&nbsp; &nbsp;很明显，5的因子的个数一定会小于等于2的因子的个数。那么直接求5的因子的个数就行了。由于，N / 5的时候用到了向下取整，<br />所以不能用等比数列求和公式，怎么把答案弄成一个公式，还不知道了。<br />&nbsp; &nbsp;PS：其实我这种思路的灵感来自于筛选素数的方法了。<br /><br />代码如下：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><div>#include&nbsp;&lt;stdio.h&gt;</div>#include&nbsp;&lt;algorithm&gt;<br />#include&nbsp;&lt;math.h&gt;<br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;GetAns(<span style="color: #0000FF; ">int</span>&nbsp;nN)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nAns&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(nN)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nAns&nbsp;+=&nbsp;nN&nbsp;/&nbsp;5;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nN&nbsp;/=&nbsp;5;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;nAns;<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nT;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d",&nbsp;&amp;nT);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(nT--)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nN;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d",&nbsp;&amp;nN);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d\n",&nbsp;GetAns(nN));<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><img src ="http://www.cppblog.com/csu-yx-2013/aggbug/185327.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/csu-yx-2013/" target="_blank">yx</a> 2012-07-27 15:05 <a href="http://www.cppblog.com/csu-yx-2013/archive/2012/07/27/185327.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>poj 1730 Perfect Pth Powers</title><link>http://www.cppblog.com/csu-yx-2013/archive/2012/07/26/185236.html</link><dc:creator>yx</dc:creator><author>yx</author><pubDate>Thu, 26 Jul 2012 12:59:00 GMT</pubDate><guid>http://www.cppblog.com/csu-yx-2013/archive/2012/07/26/185236.html</guid><wfw:comment>http://www.cppblog.com/csu-yx-2013/comments/185236.html</wfw:comment><comments>http://www.cppblog.com/csu-yx-2013/archive/2012/07/26/185236.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/csu-yx-2013/comments/commentRss/185236.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/csu-yx-2013/services/trackbacks/185236.html</trackback:ping><description><![CDATA[&nbsp; &nbsp;通过这道题确实体会到A掉数学题确实还是需要经验了，不能猜对哪个地方会丧失精度的话，会一直wa的。其实，这道题我只想出了一半。<br />题意是 a的p次方 = n，其中n是32位整数，a和p都是整数，求满足条件的最大p。好吧，虽然我是在学数论，但是看到这题，我还是想起了<br />取对数。那么可以得到，p = ln(n) / ln(a)。既然要求最大的p，那么a最小即可了。那么直接从2开始枚举a不就可以了么。<br />&nbsp; &nbsp; 可是直接枚举a的话肯定会超时的，因为a的范围太大了，比如n的是个大素数，a的范围就是2-n了，一定超时了。然后，我又想出另外一<br />种方法，对n分解因子，p就是所有因子的指数的最大公约数。呵呵，第二种方法更加会无情的超时，由于int范围很大，实现搞个素数表也不<br />可能。还是感觉时间不多了，就不多想了，然后搜了下，发现一句话，意识是枚举p。顿时觉得开朗起来，因为p最多是32。由前面可以得到<br />ln(a) = ln(n) / p。那么只要从32到1枚举p，保证a是整数即可。<br />&nbsp; &nbsp;后面发现这样精度难于控制，各种原因反正过不了题，看网上的代码，改成计算指数的形式了。因为 a = n的(1/p)次，这个可以用pow函<br />数算出来，如果a是整数，那么再计算pow(a,p)就会是n了。最难控制的是精度了，还有说n是负数的情况。不知道为什么直接处理负数答案<br />一直不对，只好把负数变为正数，同时判断p不能是偶数。<br /><br />代码如下：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;&lt;stdio.h&gt;<br />#include&nbsp;&lt;math.h&gt;<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fN;<span style="color: #008000; ">//</span><span style="color: #008000; ">用double就不会溢出了,负数就可以直接转换为正数了</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(scanf("%lf",&nbsp;&amp;fN),&nbsp;fN)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;bFlag&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fP&nbsp;=&nbsp;31.0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(fN&nbsp;&lt;&nbsp;0){fP&nbsp;=&nbsp;32.0;&nbsp;fN&nbsp;=&nbsp;-fN;&nbsp;bFlag&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;};<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(fP&nbsp;&gt;&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">必须加上一个精度,防止往下误差</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fA&nbsp;=&nbsp;pow(fN,&nbsp;1.0&nbsp;/&nbsp;fP)&nbsp;+&nbsp;1e-8;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">fA必须转换为int,因为一点点误差,pow之后就会放大很多</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fTemp&nbsp;=&nbsp;pow((<span style="color: #0000FF; ">int</span>)fA,&nbsp;fP);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">必须对负数特殊判断,不可能出现偶数的p</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(fabs(fN&nbsp;-&nbsp;fTemp)&nbsp;&lt;&nbsp;1e-8&nbsp;&amp;&amp;&nbsp;(!bFlag&nbsp;||&nbsp;((<span style="color: #0000FF; ">int</span>)fP)&nbsp;%&nbsp;2))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%.f\n",&nbsp;fP);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fP&nbsp;-=&nbsp;1.0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><img src ="http://www.cppblog.com/csu-yx-2013/aggbug/185236.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/csu-yx-2013/" target="_blank">yx</a> 2012-07-26 20:59 <a href="http://www.cppblog.com/csu-yx-2013/archive/2012/07/26/185236.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>uva 550 - Multiplying by Rotation</title><link>http://www.cppblog.com/csu-yx-2013/archive/2012/05/08/173995.html</link><dc:creator>yx</dc:creator><author>yx</author><pubDate>Tue, 08 May 2012 08:24:00 GMT</pubDate><guid>http://www.cppblog.com/csu-yx-2013/archive/2012/05/08/173995.html</guid><wfw:comment>http://www.cppblog.com/csu-yx-2013/comments/173995.html</wfw:comment><comments>http://www.cppblog.com/csu-yx-2013/archive/2012/05/08/173995.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/csu-yx-2013/comments/commentRss/173995.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/csu-yx-2013/services/trackbacks/173995.html</trackback:ping><description><![CDATA[&nbsp; &nbsp;这也是一个数学题，刚开始还真以为好难的样子，需要用到什么数论的理论啊。其实，只要去找规律就行了。<br />&nbsp;&nbsp;&nbsp;题意是给出一个进制，一个数字的最低位，和另外的一个数字，比如10进制，第一个数字的最低位是7，第二个数字是4，<br />根据这些信息，和规则（XXXXX7 * 4 = 7XXXXX，例子<span style="font-family: Simsun; line-height: normal; background-color: #ffffff; font-size: medium; ">: 179487 * 4 = 717948</span>&nbsp;）求出第一个数字的最小长度。这个<br />规则的意思是乘积是把第一个数字的最低位移动到最高位上去就行了。<br />&nbsp; &nbsp;貌似很难的样子，其实用笔在纸上求一下XXXXX7 * 4 = 7XXXXX就会发现。XXXXX7的每一位都是能够确定的，当然<br />顺序是从最低位到最高位开始。因为知道最低位，所以次低位一定是最低位*第二个数%base。以此类推，递归下去即可。<br />最终条件是，没有进位了，而且乘积+原来的进位==最低位。<br />&nbsp; &nbsp;我用的递归完全可以改成循环的形式，这样速度应该会快些。<br />&nbsp;&nbsp;&nbsp;<br />&nbsp; &nbsp;代码如下：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;&lt;stdio.h&gt;<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;nBase;<br /><span style="color: #0000FF; ">int</span>&nbsp;nTwo;<br /><span style="color: #0000FF; ">int</span>&nbsp;nOneLow;<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;GetMin(<span style="color: #0000FF; ">int</span>&nbsp;nLow,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nCarry,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nNum)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">printf("nLow:%d,&nbsp;nCarry:%d,&nbsp;nNum:%d\n",&nbsp;nLow,&nbsp;nCarry,&nbsp;nNum);</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nTemp&nbsp;=&nbsp;nCarry&nbsp;+&nbsp;nLow&nbsp;*&nbsp;nTwo;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(nTemp&nbsp;==&nbsp;nOneLow)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;nNum;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;GetMin(nTemp&nbsp;%&nbsp;nBase,&nbsp;nTemp&nbsp;/&nbsp;nBase,&nbsp;nNum&nbsp;+&nbsp;1);<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">freopen("out.txt",&nbsp;"w",&nbsp;stdout);</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(scanf("%d%d%d",&nbsp;&amp;nBase,&nbsp;&amp;nOneLow,&nbsp;&amp;nTwo)&nbsp;==&nbsp;3)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d\n",&nbsp;GetMin(nOneLow,&nbsp;0,&nbsp;0)&nbsp;+&nbsp;1);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><img src ="http://www.cppblog.com/csu-yx-2013/aggbug/173995.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/csu-yx-2013/" target="_blank">yx</a> 2012-05-08 16:24 <a href="http://www.cppblog.com/csu-yx-2013/archive/2012/05/08/173995.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>uva 107 - The Cat in the Hat</title><link>http://www.cppblog.com/csu-yx-2013/archive/2012/05/07/173913.html</link><dc:creator>yx</dc:creator><author>yx</author><pubDate>Mon, 07 May 2012 08:54:00 GMT</pubDate><guid>http://www.cppblog.com/csu-yx-2013/archive/2012/05/07/173913.html</guid><wfw:comment>http://www.cppblog.com/csu-yx-2013/comments/173913.html</wfw:comment><comments>http://www.cppblog.com/csu-yx-2013/archive/2012/05/07/173913.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/csu-yx-2013/comments/commentRss/173913.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/csu-yx-2013/services/trackbacks/173913.html</trackback:ping><description><![CDATA[&nbsp; &nbsp;这是一个很神的数学题吧。基本上过这个题的很多都会wa10多次，而且这个题好像简单的枚举其中的一个指数值都能过，可能是<br />数据量比较小。<br />&nbsp; &nbsp;但是，这个题还是有数学的解法的。但是，即使找到了这个正确的解法，过题的话，也是一件很困难的事情。题意大致如下：一只猫，<br />高度为H，戴了一个帽子，帽子里面有N只猫（N是常数，且未知），同样帽子里面的猫也戴了帽子，但是这些猫的高度变成了H / (N + 1)，<br />会向下取整。以此递归下去，直到最后的猫的高度都为1为止。现在，给出H和高度为1的猫的数量。要求的是高度大于1的猫的数量，<br />以及所有猫的高度之和。<br />&nbsp; &nbsp;很别扭吧。通过上面的信息，得出2个式子。假设one代表为高度为1的猫的数量。one = N的n次。H &gt;= (N + 1)的n次。注意第<br />二个式子不一定取等号，因为很多时候都是不能整除的。现在要求N和n。2个方程解2个未知数，应该能解出来。但是，注意的是其中<br />一个还是不等式。。。<br />&nbsp; &nbsp;指数关系很多时候会转换为对数的关系。所以，继续求对数，有lgH &gt;= n * lg(N + 1)。其中，由第一个式子可以得到n = lg(one) <br />/ lg(N)。那么最终转换为：lgH &gt;= (lg(one) / lgN) * lg(N + 1)。换个形式就是lgH / lg(One) &gt;= lg(N + 1) / lgN。现在，已经很<br />清晰了。因为，函数lg(N + 1) / lg(N) 是<strong>单调递减</strong>的。看到单调的函数，马上就会知道可以二分了。意思是，我们可以二分出一个N让<br />&nbsp;lg(N + 1) / lgN&nbsp;最接近lgH / lg(One)，而且是小于lgH / lg(One)的。剩下的工作就只是求和而已了。<br />&nbsp; &nbsp;写二分的时候，有一个地方可以注意一下。因为&nbsp;lg(N + 1) / lgN 可能会出现除数为0的情况，所以可以进一步转换为<strong>lgH * lgN &gt;=<br /> lg(N + 1) * lg(one)</strong>。&nbsp;也是求一个N让上面那个不等式2边的值最接近，而且右边小于左边。<br />&nbsp; &nbsp;能很快写对这个题真不是件容易的事情。。。<br /><br />&nbsp;&nbsp;&nbsp;代码如下：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;&lt;stdio.h&gt;<br />#include&nbsp;&lt;math.h&gt;<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nInitH,&nbsp;nOnes;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nN,&nbsp;n;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(scanf("%d%d",&nbsp;&amp;nInitH,&nbsp;&amp;nOnes),&nbsp;nInitH&nbsp;+&nbsp;nOnes)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nBeg&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nEnd&nbsp;=&nbsp;nOnes;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nMid;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(nBeg&nbsp;&lt;=&nbsp;nEnd)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nMid&nbsp;=&nbsp;(nBeg&nbsp;+&nbsp;nEnd)&nbsp;/&nbsp;2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fRes&nbsp;=&nbsp;log10(nInitH)&nbsp;*&nbsp;log10(nMid);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fTemp&nbsp;=&nbsp;log10(nMid&nbsp;+&nbsp;1)&nbsp;*&nbsp;log10(nOnes);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(fabs(fRes&nbsp;-&nbsp;fTemp)&nbsp;&lt;&nbsp;1e-10)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">printf("Find&nbsp;nN:%d\n",&nbsp;nMid);</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nN&nbsp;=&nbsp;nMid;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(fTemp&nbsp;&gt;&nbsp;fRes)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nBeg&nbsp;=&nbsp;nMid&nbsp;+&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nEnd&nbsp;=&nbsp;nMid&nbsp;-&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n&nbsp;=&nbsp;floor(log10(nInitH)&nbsp;/&nbsp;log10(nN&nbsp;+&nbsp;1)&nbsp;+&nbsp;1e-9);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">printf("nN:%d,&nbsp;n:%d\n",&nbsp;nN,&nbsp;n);</span><span style="color: #008000; "><br /></span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nSum&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nLazy&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nNum&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;=&nbsp;n;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nSum&nbsp;+=&nbsp;nNum&nbsp;*&nbsp;nInitH;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nLazy&nbsp;+=&nbsp;nNum;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nNum&nbsp;*=&nbsp;nN;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nInitH&nbsp;/=&nbsp;(nN&nbsp;+&nbsp;1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d&nbsp;%d\n",&nbsp;nLazy&nbsp;-&nbsp;nOnes,&nbsp;nSum);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><br />&nbsp; &nbsp;<img src ="http://www.cppblog.com/csu-yx-2013/aggbug/173913.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/csu-yx-2013/" target="_blank">yx</a> 2012-05-07 16:54 <a href="http://www.cppblog.com/csu-yx-2013/archive/2012/05/07/173913.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>uva 10112 - Myacm Triangles</title><link>http://www.cppblog.com/csu-yx-2013/archive/2012/05/07/173895.html</link><dc:creator>yx</dc:creator><author>yx</author><pubDate>Mon, 07 May 2012 06:07:00 GMT</pubDate><guid>http://www.cppblog.com/csu-yx-2013/archive/2012/05/07/173895.html</guid><wfw:comment>http://www.cppblog.com/csu-yx-2013/comments/173895.html</wfw:comment><comments>http://www.cppblog.com/csu-yx-2013/archive/2012/05/07/173895.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/csu-yx-2013/comments/commentRss/173895.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/csu-yx-2013/services/trackbacks/173895.html</trackback:ping><description><![CDATA[&nbsp; &nbsp;这是一个几何题。题意是给出一系列点，点最多才15个，求一个这里面的三个点组合出来的三角形，其面积是最大的，而且没有任何其它<br />的点在这个三角形的内部和边界上。求三角形的面积，题目上面已经给了公式，也可以用0.5*|a|*|b|*sin(a,b)求，这里的a和b指的是2条<br />边代表的向量。<br />&nbsp; &nbsp;现在就剩下一个问题了，怎么判断一个点在三角形的内部和边界上。在边界上，比较好判断，判断是否共线，然后再点是在线段的内部。<br />具体说明下，判断一个点在三角形内部的思路。我用的还是线性规划的思想。<strong>如果该点在三角形的内部，那么任取三角形的一条边，<br />该内部点和剩余的三角形的一个顶点必定在三角形的那条的边的同一侧。</strong>这个方法也可以推广到N边的凸多边形，证明的话很简单，<br />因为线性规划一直在划分区域。所以，划分到最后围起来的区域就是凸多边形的内部了。<br />&nbsp; &nbsp;至于写代码的话，由于是第一次写这种几何题，写得很凌乱。<br /><br />&nbsp; &nbsp;代码如下：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;&lt;stdio.h&gt;<br />#include&nbsp;&lt;math.h&gt;<br /><br /><span style="color: #0000FF; ">#define</span>&nbsp;MAX&nbsp;(20)<br /><span style="color: #0000FF; ">int</span>&nbsp;nN;<br /><span style="color: #0000FF; ">struct</span>&nbsp;Point<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;szLabel[5];<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;x;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;y;<br />};<br />Point&nbsp;points[MAX];<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">三点是否共线</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">bool</span>&nbsp;IsOneLine(<span style="color: #0000FF; ">int</span>&nbsp;nOne,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nTwo,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nThree)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nA&nbsp;=&nbsp;points[nTwo].x&nbsp;-&nbsp;points[nOne].x;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nB&nbsp;=&nbsp;points[nTwo].y&nbsp;-&nbsp;points[nOne].y;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nC&nbsp;=&nbsp;points[nThree].x&nbsp;-&nbsp;points[nOne].x;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nD&nbsp;=&nbsp;points[nThree].y&nbsp;-&nbsp;points[nOne].y;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;(nA&nbsp;*&nbsp;nD&nbsp;==&nbsp;nB&nbsp;*&nbsp;nC);<br />}<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">点nOne和点nTwo是否在直线(nBeg,nEnd)的同一侧(不能在直线上)</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">bool</span>&nbsp;IsSameSide(<span style="color: #0000FF; ">int</span>&nbsp;nBeg,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nEnd,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nOne,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nTwo)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">求直线的向量</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nA&nbsp;=&nbsp;points[nBeg].x&nbsp;-&nbsp;points[nEnd].x;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nB&nbsp;=&nbsp;points[nBeg].y&nbsp;-&nbsp;points[nEnd].y;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">直线方程为nB(x&nbsp;-&nbsp;points[nBeg].x)&nbsp;-&nbsp;nA(y&nbsp;-&nbsp;points[nBeg].y)&nbsp;=&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">分别用nOne和nTwo的坐标代入直线方程计算结果，然后将结果相乘<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">乘积必须大于0</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nRes&nbsp;=&nbsp;(nB&nbsp;*&nbsp;(points[nOne].x&nbsp;-&nbsp;points[nBeg].x)&nbsp;-&nbsp;nA&nbsp;*&nbsp;(points[nOne].y&nbsp;-&nbsp;points[nBeg].y))<br />&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;(nB&nbsp;*&nbsp;(points[nTwo].x&nbsp;-&nbsp;points[nBeg].x)&nbsp;-&nbsp;nA&nbsp;*&nbsp;(points[nTwo].y&nbsp;-&nbsp;points[nBeg].y));<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(nRes&nbsp;&gt;&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">printf("点:%d,点:%d,在直线nBeg:%d,&nbsp;nEnd:%d的同一侧\n",&nbsp;nOne,&nbsp;nTwo,&nbsp;nBeg,&nbsp;nEnd);</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;nRes&nbsp;&gt;&nbsp;0;<br />}<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">点是否在三角形(nOne,&nbsp;nTwo,&nbsp;nThree)外部</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">bool</span>&nbsp;PointOutTriangle(<span style="color: #0000FF; ">int</span>&nbsp;nOne,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nTwo,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nThree,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nPoint)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">前面3个ifelse是判断点是否在边上</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(IsOneLine(nOne,&nbsp;nTwo,&nbsp;nPoint))<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;((points[nOne].x&nbsp;-&nbsp;points[nPoint].x)&nbsp;*&nbsp;(points[nTwo].x&nbsp;-&nbsp;points[nPoint].x)&nbsp;&lt;=&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(IsOneLine(nOne,&nbsp;nThree,&nbsp;nPoint))<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;((points[nOne].x&nbsp;-&nbsp;points[nPoint].x)&nbsp;*&nbsp;(points[nThree].x&nbsp;-&nbsp;points[nPoint].x)&nbsp;&lt;=&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(IsOneLine(nTwo,&nbsp;nThree,&nbsp;nPoint))<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;((points[nTwo].x&nbsp;-&nbsp;points[nPoint].x)&nbsp;*&nbsp;(points[nThree].x&nbsp;-&nbsp;points[nPoint].x)&nbsp;&lt;=&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">下面的IsSameSide如果nPoint在直线的(nOne,nTwo)的外侧也会判断为假<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">所以需要先在上面判断点是否在边的内侧</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;!(IsSameSide(nOne,&nbsp;nTwo,&nbsp;nThree,&nbsp;nPoint)<br />&nbsp;&nbsp;&nbsp;&nbsp;&amp;&amp;&nbsp;IsSameSide(nOne,&nbsp;nThree,&nbsp;nTwo,&nbsp;nPoint)<br />&nbsp;&nbsp;&nbsp;&nbsp;&amp;&amp;&nbsp;IsSameSide(nTwo,&nbsp;nThree,&nbsp;nOne,&nbsp;nPoint));<br />}<br /><br /><span style="color: #0000FF; ">bool</span>&nbsp;IsValid(<span style="color: #0000FF; ">int</span>&nbsp;nOne,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nTwo,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nThree)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(IsOneLine(nOne,&nbsp;nTwo,&nbsp;nThree))<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">printf("点:%d,%d,%d共线\n",&nbsp;nOne,&nbsp;nTwo,&nbsp;nThree);</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;nN;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(i&nbsp;==&nbsp;nOne&nbsp;||&nbsp;i&nbsp;==&nbsp;nTwo&nbsp;||&nbsp;i&nbsp;==&nbsp;nThree)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">continue</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(!PointOutTriangle(nOne,&nbsp;nTwo,&nbsp;nThree,&nbsp;i))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">printf("点:%d,&nbsp;在三角形:%d,%d,%d内部\n",&nbsp;i,&nbsp;nOne,&nbsp;nTwo,&nbsp;nThree);</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;<br />}<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">计算三角形(nOne,&nbsp;nTwo,&nbsp;nThree)的面积</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">double</span>&nbsp;GetArea(<span style="color: #0000FF; ">int</span>&nbsp;nOne,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nTwo,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nThree)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0.5&nbsp;*&nbsp;fabs((points[nThree].y&nbsp;-&nbsp;points[nOne].y)&nbsp;*&nbsp;(points[nTwo].x&nbsp;-&nbsp;points[nOne].x)<br />&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;(points[nTwo].y&nbsp;-&nbsp;points[nOne].y)&nbsp;*&nbsp;(points[nThree].x&nbsp;-&nbsp;points[nOne].x));<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(scanf("%d",&nbsp;&amp;nN),&nbsp;nN)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;nN;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%s%d%d",&nbsp;points[i].szLabel,&nbsp;&amp;points[i].x,&nbsp;&amp;points[i].y);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fMaxArea&nbsp;=&nbsp;0.0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nI&nbsp;=&nbsp;-1,&nbsp;nJ&nbsp;=&nbsp;-1,&nbsp;nK&nbsp;=&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;nN&nbsp;-&nbsp;2;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;i&nbsp;+&nbsp;1;&nbsp;j&nbsp;&lt;&nbsp;nN&nbsp;-&nbsp;1;&nbsp;++j)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;k&nbsp;=&nbsp;j&nbsp;+&nbsp;1;&nbsp;k&nbsp;&lt;&nbsp;nN;&nbsp;++k)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(IsValid(i,&nbsp;j,&nbsp;k))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">printf("i:%d,j:%d,k:%d&nbsp;valid\n",&nbsp;i,&nbsp;j,&nbsp;k);</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fArea&nbsp;=&nbsp;GetArea(i,&nbsp;j,&nbsp;k);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">printf("Area:%f\n",&nbsp;fArea);</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(fArea&nbsp;&gt;&nbsp;fMaxArea)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nI&nbsp;=&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nJ&nbsp;=&nbsp;j;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nK&nbsp;=&nbsp;k;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fMaxArea&nbsp;=&nbsp;fArea;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%s%s%s\n",&nbsp;points[nI].szLabel,&nbsp;points[nJ].szLabel,&nbsp;points[nK].szLabel);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><img src ="http://www.cppblog.com/csu-yx-2013/aggbug/173895.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/csu-yx-2013/" target="_blank">yx</a> 2012-05-07 14:07 <a href="http://www.cppblog.com/csu-yx-2013/archive/2012/05/07/173895.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>uva 10025 - The ? 1 ? 2 ? ... ? n = k problem</title><link>http://www.cppblog.com/csu-yx-2013/archive/2012/05/04/173663.html</link><dc:creator>yx</dc:creator><author>yx</author><pubDate>Fri, 04 May 2012 08:53:00 GMT</pubDate><guid>http://www.cppblog.com/csu-yx-2013/archive/2012/05/04/173663.html</guid><wfw:comment>http://www.cppblog.com/csu-yx-2013/comments/173663.html</wfw:comment><comments>http://www.cppblog.com/csu-yx-2013/archive/2012/05/04/173663.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/csu-yx-2013/comments/commentRss/173663.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/csu-yx-2013/services/trackbacks/173663.html</trackback:ping><description><![CDATA[&nbsp;
&nbsp;&nbsp;这也算一个数学类的杂题吧。题目本身比较有意思，解题的思路很需要猜想。题目的意思用+和-去替代式子(? 1 ? 2 ? ... ? n = k)中<br />的？号，对于指定的K，求最小的n。<br />&nbsp;&nbsp;&nbsp;For example: to obtain&nbsp;k = 12&nbsp;, - 1 + 2 + 3 + 4 + 5 + 6 - 7 = 12&nbsp;with&nbsp;n = 7。&nbsp; &nbsp;<br style="font-size: 12pt; " />&nbsp;&nbsp;&nbsp;这个题，我的思路大致如下。首先，K可能是正的也是负的，而且显然负的情况，有相应的正对应情况。那么考虑所有k为正的情况。<br />由于k一定小于等于n*(n+1)/2的，所以可以先求出这样的最小n。这个可以二分搜索，或者直接用解不等式方程(不过这种方法一直wa了)。<br style="font-size: 12pt; " />&nbsp; &nbsp;然后就剩下的是第二点了，假设a + b =&nbsp;n*(n+1)/2, a - b = k。可以得到
<strong>n*(n+1)/2 - k = 2 * b。</strong>意思是，必须满足
n*(n+1)/2<br />和k的差为偶数。假如满足了，这样的n是不是一定OK了？？？&nbsp; &nbsp;<br style="font-size: 12pt; " />&nbsp; &nbsp;答案是肯定的，这一点就是需要猜想的地方了。因为，仔细观察下，1到n的数字可以组合出任意的1到&nbsp;n*(n+1)/4之间的数字，这个数字<br />即是b。至于证明，可以用数学归纳法从n==1开始证明了。。。至此已经很简单了。&nbsp;&nbsp;<br style="font-size: 12pt; " />&nbsp; &nbsp;由于求n存在2种不同的方法，而且我开始用解一元二次不等式的方法求的N，出现了浮点误差，一直WA了。后面改成二分才过了。。。<br /><br />&nbsp; &nbsp;代码如下：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all">#include&nbsp;&lt;stdio.h&gt;&nbsp;<br />#include&nbsp;&lt;math.h&gt;<br /><br />int&nbsp;GetN(int&nbsp;nK)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;nBeg&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;nEnd&nbsp;=&nbsp;sqrt(nK&nbsp;*&nbsp;2)&nbsp;+&nbsp;2;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(nBeg&nbsp;&lt;=&nbsp;nEnd)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;nMid&nbsp;=&nbsp;(nBeg&nbsp;+&nbsp;nEnd)&nbsp;/&nbsp;2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;nTemp&nbsp;=&nbsp;(nMid&nbsp;*&nbsp;nMid&nbsp;+&nbsp;nMid)&nbsp;/&nbsp;2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(nTemp&nbsp;&gt;=&nbsp;nK)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nEnd&nbsp;=&nbsp;nMid&nbsp;-&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nBeg&nbsp;=&nbsp;nMid&nbsp;+&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;nEnd&nbsp;+&nbsp;1;<br />}<br /><br />int&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;nK;<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;nTest;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d",&nbsp;&amp;nTest);<br />&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(nTest--)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d",&nbsp;&amp;nK);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(nK&nbsp;&lt;&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nK&nbsp;*=&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//int&nbsp;nN&nbsp;=&nbsp;ceil(sqrt(2&nbsp;*&nbsp;fabs(1.0&nbsp;*&nbsp;nK)&nbsp;+&nbsp;0.25)&nbsp;-&nbsp;0.5&nbsp;+&nbsp;1e-9);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//上面那种方法存在浮点误差,wa了三次<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;nN&nbsp;=&nbsp;GetN(nK);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(((nN&nbsp;*&nbsp;nN&nbsp;+&nbsp;nN)&nbsp;/&nbsp;2&nbsp;-&nbsp;nK)&nbsp;%&nbsp;2&nbsp;==&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d\n",&nbsp;nN);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++nN;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(nTest)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />}</div><img src ="http://www.cppblog.com/csu-yx-2013/aggbug/173663.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/csu-yx-2013/" target="_blank">yx</a> 2012-05-04 16:53 <a href="http://www.cppblog.com/csu-yx-2013/archive/2012/05/04/173663.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>uva 10014 - Simple calculations</title><link>http://www.cppblog.com/csu-yx-2013/archive/2012/05/03/173597.html</link><dc:creator>yx</dc:creator><author>yx</author><pubDate>Thu, 03 May 2012 10:55:00 GMT</pubDate><guid>http://www.cppblog.com/csu-yx-2013/archive/2012/05/03/173597.html</guid><wfw:comment>http://www.cppblog.com/csu-yx-2013/comments/173597.html</wfw:comment><comments>http://www.cppblog.com/csu-yx-2013/archive/2012/05/03/173597.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/csu-yx-2013/comments/commentRss/173597.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/csu-yx-2013/services/trackbacks/173597.html</trackback:ping><description><![CDATA[&nbsp; &nbsp;说实话，这个题不是我亲自推算出来。一直想到崩溃了，明知道只差一步，硬是无法想出来。实在想不出了，看了下别人解题报告上<br />的解释。真的很惭愧很崩溃。。。这就是一个数列推理的题目吧。<br />&nbsp; &nbsp;给出一个数列ci（1&lt;=ci&lt;=n)，然后给出数列ai中的a0和a(n+1)。并给出一个公式ai = ( a(i-1) + a(i+1) ) &nbsp;/ &nbsp;2 - ci。题目的意思<br />是让求a1。大家在很久以前的高中时代一定做过很多的数列题，所以我一看到这个题还是感觉很亲切的。然后就开始推算。我把上面那<br />个公式，从i==1到i==n，全部累加起来。消去2边一样的项，得到一个结果<strong>a1 + an = a0 + a(n+1) - 2&nbsp;</strong><font class="UNICODE"><strong>&#931;ci(1&lt;=i&lt;=n)</strong>。从这<br />个公式，我只能得到a1和an 的和。想来想去都无法直接求出a1的值。但是，我也知道如果能求出a1，那么ai中的任何其它项都是能求<br />出来的。我猜想a1和an相等，提交当然wa了。然后，我猜想ai是a0和a(n+1)的i分点，提交还是wa了。后面这个猜想倒是合理点，但是<br />还是有不严谨的地方，因为那样，a1的值之和a0，a(n+1)，c1这三个值有关系了。<br />&nbsp;&nbsp;&nbsp;这个题其实以前我想了一下，没想出来。然后今天重新想的时候可能受以前的影响，限制了一个思路。那就是，再对式子a1 + an =<br /> a0 + a(n+1) - 2&nbsp;&#931;ci(1&lt;=i&lt;=n)进行累加。其实，也有a1 + a(n-1) = a0 + an -&nbsp;2&nbsp;&#931;ci(1&lt;=i&lt;=n-1)。这样累加n次，刚好可以把<br />a2-an全部消去。可以得到，一个式子<strong>(n+1)a1 = n * a0 + a(n+1)- 2&nbsp;&nbsp;&#931;&#931;&nbsp;cj(1&lt;=j&lt;=i)&nbsp;(1&lt;=i&lt;=n)</strong>。那么就可以直接求出a1了。<br />&nbsp; &nbsp;公式：<img src="http://www.cppblog.com/images/cppblog_com/csu-yx/mathtex.gif" width="254" height="42" alt="" /><br />&nbsp;&nbsp;&nbsp;<br />&nbsp; &nbsp;代码如下：<br /></font><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;&lt;stdio.h&gt;<br />#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>.h&gt;<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nCases;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nN;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;a0,&nbsp;an1;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;a1;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;ci[3000&nbsp;+&nbsp;10];<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;c;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;sum;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d",&nbsp;&amp;nCases);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(nCases--)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d",&nbsp;&amp;nN);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%lf%lf",&nbsp;&amp;a0,&nbsp;&amp;an1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum&nbsp;=&nbsp;0.0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(ci,&nbsp;0,&nbsp;<span style="color: #0000FF; ">sizeof</span>(ci));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;1;&nbsp;j&nbsp;&lt;=&nbsp;nN;&nbsp;++j)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%lf",&nbsp;&amp;c);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ci[j]&nbsp;=&nbsp;ci[j&nbsp;-&nbsp;1]&nbsp;+&nbsp;c;<span style="color: #008000; ">//</span><span style="color: #008000; ">ci[j]代表数列ci中第1-j项的和</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum&nbsp;+=&nbsp;ci[j];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a1&nbsp;=&nbsp;(nN&nbsp;*&nbsp;a0&nbsp;+&nbsp;an1&nbsp;-&nbsp;2&nbsp;*&nbsp;sum)&nbsp;/&nbsp;(nN&nbsp;+&nbsp;1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%.2f",&nbsp;a1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;putchar('\n');<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(nCases)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;putchar('\n');<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><img src ="http://www.cppblog.com/csu-yx-2013/aggbug/173597.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/csu-yx-2013/" target="_blank">yx</a> 2012-05-03 18:55 <a href="http://www.cppblog.com/csu-yx-2013/archive/2012/05/03/173597.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>uva 10061 - How many zero's and how many digits ?</title><link>http://www.cppblog.com/csu-yx-2013/archive/2012/05/02/173512.html</link><dc:creator>yx</dc:creator><author>yx</author><pubDate>Wed, 02 May 2012 12:05:00 GMT</pubDate><guid>http://www.cppblog.com/csu-yx-2013/archive/2012/05/02/173512.html</guid><wfw:comment>http://www.cppblog.com/csu-yx-2013/comments/173512.html</wfw:comment><comments>http://www.cppblog.com/csu-yx-2013/archive/2012/05/02/173512.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/csu-yx-2013/comments/commentRss/173512.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/csu-yx-2013/services/trackbacks/173512.html</trackback:ping><description><![CDATA[&nbsp; &nbsp;这又是一个数学题，不过我还是比较喜欢做这类数学杂题的。题目意思很简单，给2个十进制数，n和b。如果用b进制表示n!，<br />需要多少位数，这个表示末尾会有多少个0。这个题并不需要什么高深的知识，这一点也是我喜欢做这类题的一个方法。<br />大家显然都知道求n！用10进制表示末尾会有多少个0的方法，就是求2*5最多有多少对。那么，b进制了。方法类似，发散一下想法而已。<br />&nbsp; &nbsp;我还是先说求多少位数的方法吧。 <strong>b的m-1次 &lt;= n！&lt;= b的m次</strong>（PS，这个不等式如果把b换成10大家一定会明白的），<br />看到这个不等式应该有想法了吧。两边同时取logb，就可以得到<font class="UNICODE"><strong>&#931;logi(1&lt;=i&lt;=n) &lt;= m</strong>，m直接就求出来了。m即是位数。<br />&nbsp; &nbsp;再说怎么求末尾0的，发散下想法，我们也可以对n！中的每个因子试着求b的因子对，一共有多少对。但是，后面发现这样不行，<br />因为比如b是16，1和16是一对因子，2和8是一对因子，4和4是一对因子，也就是因为2也是4的因子，这样计算因子对就会重复了。<br />但是对于b等于10的情况，可以例外而已。<br />&nbsp;&nbsp;&nbsp;呵呵，考虑其它的方法。求素数因子。任何数字都可以被分解为一些素数因子的乘积，这是毋容置疑的。那么，<strong>我们去分解n！中的<br />小于等于b的素数因子，并将其个数存储在数组里面。然后死循环的去分解b的素数因子，能够完全分解一次<br />(具体看下代码，不好描述），ans就加1。</strong>否则，已经没有末尾0了。<br />&nbsp; &nbsp;虽然提交了16次才过。不过最后还算不错吧，只用了0.508s。相比20s的时间界限，很小了。网上有些过的代码，跑一个数据都要<br />几分钟。。。PS：uva上那些神人，怎么用0.0s算出来的，很难想象啊。<br />&nbsp; &nbsp;这个题目还有个很大的需要注意的地方，就是浮点数的精度问题。前面讲到求位数需要用到log函数，log函数的计算精度就出问题了。<br />最后需要对和加一个<strong>1e-9</strong>再floor才能过。特别需要注意这一点，因为开始我的程序过了所有的</font><a href="http://online-judge.uva.es/board/viewtopic.php?f=9&amp;t=7137&amp;start=30">http://online-judge.uva.es/board/viewtopic.php?f=9&amp;t=7137&amp;start=30</a>上说的数据还是wa了。而且我还发现<strong>log10计算精度高</strong>很多，如果log(这个是自然对数)去计算，这个网站上的数据都过不了。<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;&lt;stdio.h&gt;<br />#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>.h&gt;<br />#include&nbsp;&lt;math.h&gt;<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;nN,&nbsp;nB;<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;nDivisor[1000];<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;GetDigit(<span style="color: #0000FF; ">int</span>&nbsp;nN,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nB)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fSum&nbsp;=&nbsp;0.0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;2;&nbsp;i&nbsp;&lt;=&nbsp;nN;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fSum&nbsp;+=&nbsp;log10(i);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;fSum&nbsp;/=&nbsp;log10(nB);<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;floor(fSum&nbsp;+&nbsp;1e-9)&nbsp;+&nbsp;1;<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;GetZero(<span style="color: #0000FF; ">int</span>&nbsp;nN,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nB)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;memset(nDivisor,&nbsp;0,&nbsp;<span style="color: #0000FF; ">sizeof</span>(nDivisor));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;2;&nbsp;i&nbsp;&lt;=&nbsp;nN;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nTemp&nbsp;=&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;2;&nbsp;j&nbsp;&lt;=&nbsp;nTemp&nbsp;&amp;&amp;&nbsp;j&nbsp;&lt;=&nbsp;nB;&nbsp;++j)//这样循环就可以进行素数因子分解了<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(nTemp&nbsp;%&nbsp;j&nbsp;==&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nDivisor[j]++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nTemp&nbsp;/=&nbsp;j;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nAns&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nTemp&nbsp;=&nbsp;nB;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;2;&nbsp;j&nbsp;&lt;=&nbsp;nTemp;&nbsp;++j)//分解nB<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(nTemp&nbsp;%&nbsp;j&nbsp;==&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(nDivisor[j]&nbsp;&gt;&nbsp;0)//如果还可以继续分解<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--nDivisor[j];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><span> //直接可以goto跳出多重循环了</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">goto</span>&nbsp;<span style="color: #0000FF; ">out</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nTemp&nbsp;/=&nbsp;j;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++nAns;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #0000FF; ">out</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;nAns;<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(scanf("%d%d",&nbsp;&amp;nN,&nbsp;&amp;nB)&nbsp;==&nbsp;2)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nDigit&nbsp;=&nbsp;GetDigit(nN,&nbsp;nB);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nZero&nbsp;=&nbsp;GetZero(nN,&nbsp;nB);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d&nbsp;%d\n",&nbsp;nZero,&nbsp;nDigit);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><img src ="http://www.cppblog.com/csu-yx-2013/aggbug/173512.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/csu-yx-2013/" target="_blank">yx</a> 2012-05-02 20:05 <a href="http://www.cppblog.com/csu-yx-2013/archive/2012/05/02/173512.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>uva 10790 - How Many Points of Intersection?</title><link>http://www.cppblog.com/csu-yx-2013/archive/2012/04/12/171132.html</link><dc:creator>yx</dc:creator><author>yx</author><pubDate>Thu, 12 Apr 2012 12:44:00 GMT</pubDate><guid>http://www.cppblog.com/csu-yx-2013/archive/2012/04/12/171132.html</guid><wfw:comment>http://www.cppblog.com/csu-yx-2013/comments/171132.html</wfw:comment><comments>http://www.cppblog.com/csu-yx-2013/archive/2012/04/12/171132.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/csu-yx-2013/comments/commentRss/171132.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/csu-yx-2013/services/trackbacks/171132.html</trackback:ping><description><![CDATA[<a href="http://uva.onlinejudge.org/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=99&amp;page=show_problem&amp;problem=1731">http://uva.onlinejudge.org/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=99&amp;page=show_problem&amp;problem=1731</a>&nbsp;<br /><br />&nbsp; &nbsp;这是一个数学题，比较有意思。题意大致是：有2条平行的直线，第一条上面有m个点，第二条上面有n个点。那么连接这写点能产生m*n<br />条直线(不包括和原来的执行平行的直线)。问这m*n直线最多有多少个内交点(意思是不属于原来m,n个点的交点)...<br />&nbsp;&nbsp;&nbsp;<img src="http://uva.onlinejudge.org/external/107/p10790.jpg" alt="" /><br />&nbsp; &nbsp;想来想去，推理了1个多小时才出来正式结果。感觉比较有意思，写篇博文记录下。我先是从反面排除，想了试了好久到最后还是发现无法<br />排除干净。。。最后只能从正面开始求证了。我这样定义一条执行(i，j)，其中i代表在第一条直线中的端点，j代表在第二条直线中的端点。<br />显然1 &lt;= i &lt;= m，而且1 &lt;= j &lt;= n。<br />&nbsp;&nbsp;&nbsp;现在的话只要求出和直线(i，j)相加的直线有多少条，然后对i，j进行累加求和。再对和除以2就能得到答案了。<br />&nbsp; &nbsp;那么有多少条直线能和直线(i，j）相交了。很显然，和(i,j)相交的直线的端点必须在其两侧。意思是在第一条直线中的端点范围为<br />[1, &nbsp;i - 1],在第二条直线中的端点范围为[j + 1, n]，总结(i - 1) * (n - j) 条直线。但是还有第二种情况,在第一条直线中的端点范围<br />为[i + 1, m],&nbsp;在第二条直线中的端点范围为[1, &nbsp;j - 1]，总结(m - i) * (j - 1) 条直线。 <br />&nbsp;&nbsp;&nbsp;总计sum = i * n + i - m -n + j (m - 2 * i + 1) 条直线。<br />&nbsp; &nbsp;再求<font class="UNICODE">&#931;</font>sum（j从1到n)得到和式(m*n*n - m*n - n*n + n) / 2，再对这个式子进行i从1到m的累加。因为没有i了，其效果就是乘以m。<br />然后最终的和除以2，所以最后的表达式是(m*m*n*n - m*m*n - m*n*n + m*n) / 4。这个式子显然是关于m,n对称的。<br />这一点也可以验证这个式子的正确性。<br /><br /><br />程序写起来就很简单了，代码如下：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all">#include&nbsp;&lt;iostream&gt;&nbsp;<br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;m,&nbsp;n;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nCases&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(cin&nbsp;&gt;&gt;&nbsp;m&nbsp;&gt;&gt;&nbsp;n,&nbsp;m&nbsp;+&nbsp;n&nbsp;!=&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;a&nbsp;=&nbsp;m&nbsp;*&nbsp;m;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;b&nbsp;=&nbsp;n&nbsp;*&nbsp;n;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;"Case&nbsp;"&nbsp;&lt;&lt;&nbsp;++nCases&nbsp;&lt;&lt;&nbsp;":&nbsp;"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;&lt;&nbsp;(a&nbsp;*&nbsp;b&nbsp;-&nbsp;a&nbsp;*&nbsp;n&nbsp;-&nbsp;b&nbsp;*&nbsp;m&nbsp;+&nbsp;m&nbsp;*&nbsp;n)&nbsp;/&nbsp;4&nbsp;&lt;&lt;&nbsp;endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><img src ="http://www.cppblog.com/csu-yx-2013/aggbug/171132.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/csu-yx-2013/" target="_blank">yx</a> 2012-04-12 20:44 <a href="http://www.cppblog.com/csu-yx-2013/archive/2012/04/12/171132.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>