<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet href='http://feed.feedsky.com/styles/temp01.xsl' type='text/xsl' ?><!--这是一个由Feedsy提供技术支持的Feed，为了提高读者阅读的体验，以及满足用户美化自己Feed的需要，我们设计了多种精美的Feed模板，提供给大家选择，所有最终呈现出来的样式，皆由用户自愿选择使用，未经许可，任何团体和个人，请不要擅自修改样式或者盗用，这是对于用户选择权的尊重。--><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fs="http://www.feedsky.com/namespace/feed" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link href="http://feed.feedsky.com/AC_ben1222" type="application/rss+xml" rel="self"></atom:link><fs:self_link href="http://feed.feedsky.com/AC_ben1222" type="application/rss+xml"></fs:self_link><lastBuildDate>Sun, 01 May 2011 05:34:54 GMT</lastBuildDate><title>AC</title><description>ACM-ICPC,Project Euler,Puzzles,...</description><link>http://www.ben1222.com/wordpress</link><sy:updatePeriod>hourly</sy:updatePeriod><sy:updateFrequency>1</sy:updateFrequency><language>en</language><pubDate>Sun, 01 May 2011 05:34:54 GMT</pubDate><item><title>pe vol31 151~155</title><link>http://www.ben1222.com/wordpress/archives/32530</link><content:encoded>&lt;p&gt;最近好像没什么干劲啊&amp;#8230;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://projecteuler.net/index.php?section=problems&amp;amp;page=4&quot;&gt;Project Euler&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Problem 151 : C++,裁纸,数学期望&lt;br /&gt;
Problem 152 : C++,1/2用整数的平方的倒数的和来表示的方法数&lt;br /&gt;
Problem 153 : C++,整除n的高斯整数之和&lt;br /&gt;
Problem 154 : C++,(x+y+z)&lt;sup&gt;200000&lt;/sup&gt; 中有多少个系数是10&lt;sup&gt;12&lt;/sup&gt;的整数倍&lt;br /&gt;
Problem 155 : C++,用18个相同容量的电容串联并联等能组成多少种不同的电容值&lt;/p&gt;
&lt;p&gt;下面是详细内容:&lt;br /&gt;
&lt;span id=&quot;more-32530&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a name=&quot;pe_problem_151&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;pe_solution&quot;&gt;Problem 151&lt;br /&gt;
&lt;a style=&quot;text-decoration: none;&quot; title=&quot;Click to view problem&quot; href=&quot;http://projecteuler.net/index.php?section=problems&amp;amp;id=151&quot;&gt;Paper sheets of standard sizes: an expected-value problem.&lt;/a&gt;&lt;br /&gt;
Project Euler 151&lt;br /&gt;
一开始只有一张A1的纸,每次随机取出一张纸&lt;br /&gt;
如果不是A5则按题意切,切完拿走一张A5,其余放回&lt;br /&gt;
如果是A5则拿走&lt;br /&gt;
除去第一次和最后一次,拿的时候发现只剩一张纸的次数的数学期望是多少 &lt;/p&gt;
&lt;p&gt;每个状态算一遍就行了&lt;br /&gt;
对每一天来说,记录 {各大小纸张的数量,至今为止遇到只剩一张纸的情况的次数} = 出现概率&lt;br /&gt;
状态不多,用map就够用了&lt;br /&gt;
从第一天开始依次计算下一天的所有状态的出现概率&lt;br /&gt;
然后(概率*次数)求和即可
&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;&lt;a name=&quot;pe_problem_152&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;pe_solution&quot;&gt;Problem 152&lt;br /&gt;
&lt;a style=&quot;text-decoration: none;&quot; title=&quot;Click to view problem&quot; href=&quot;http://projecteuler.net/index.php?section=problems&amp;amp;id=152&quot;&gt;Writing 1/2 as a sum of inverse squares&lt;/a&gt;&lt;br /&gt;
把1/2表示成许多不同整数的平方的倒数的和&lt;br /&gt;
求从2~80这几个整数取数,按上述计算,有多少种方法表示1/2 &lt;/p&gt;
&lt;p&gt;既然最后要表示成1/2,那么分母中除了2以外的质数因子都要能消除才行&lt;br /&gt;
怎么才能消除呢&amp;#8230;&lt;br /&gt;
1/a+1/b=(a+b)/(a*b)&lt;br /&gt;
如果a和b互质的话,(a+b)和(a*b)也互质&lt;br /&gt;
c/a+d/b=(b*c+a*d)/(a*b)&lt;br /&gt;
如果a和b互质且c/a和d/b是既约分数的话,(b*c+a*d)和(a*b)也互质&amp;#8230;&lt;/p&gt;
&lt;p&gt;因此为了消除分母上的某个质因子,这个质因子至少要在两项中出现&lt;br /&gt;
分母只能取2~80的平方,超过40的质数最多只有一个&amp;#8230;所以这些数就不考虑了&lt;br /&gt;
而超过7的质数之间又是不相关的(2~80中没有哪个数是两个超过7的质数的积)&lt;br /&gt;
既然是不相关的就可以单独拿出来看看&amp;#8230;能有哪几种消除该质数因子的方法&lt;/p&gt;
&lt;p&gt;写段程序检测下来发现含有大于7的质数的因子的数中只有这么一组可以消除该质数的:&lt;/p&gt;
&lt;pre&gt;
	1/144=1/169+1/1521+1/2704=1/13&lt;sup&gt;2&lt;/sup&gt;+1/39&lt;sup&gt;2&lt;/sup&gt;+1/52&lt;sup&gt;2&lt;/sup&gt;
&lt;/pre&gt;
&lt;p&gt;那么还剩下39个数: &lt;/p&gt;
&lt;pre&gt;2,3,4,5,6,7,8,9,10,12,14,15,16,18,20,21,24,25,27,28,
30,32,35,36,40,42,45,48,49,50,54,56,60,63,64,70,72,75,80&lt;/pre&gt;
&lt;p&gt;算上1/144这个,还剩40个数,其中12出现2次 &lt;/p&gt;
&lt;p&gt;既然这结果这么好,那么带7这个因子的数也拿来组合一下试试&amp;#8230;&lt;br /&gt;
这下就有好多种消除质因子7的组合了,有19个&lt;br /&gt;
剩下的数字有30个: &lt;/p&gt;
&lt;pre&gt;2,3,4,5,6,8,9,10,12,15,16,18,20,24,25,27,
30,32,36,40,45,48,50,54,60,64,72,75,80,12&lt;/pre&gt;
&lt;p&gt;本来以为这19个组合里面如果两两没有交集的话,还要考虑选取这2个的情况&lt;br /&gt;
实际上多虑了,因为两个都选取的情况已经包含在这些组合里面了 &lt;/p&gt;
&lt;p&gt;那么在这19个数任取一个或者一个都不取&amp;#8230;然后和带有5的因子的数组合起来看看消除5这个因子有多少种组合&lt;br /&gt;
有475个组合,其中不相同的数有252个&lt;br /&gt;
还剩18个数字:&lt;br /&gt;
2,3,4,6,8,9,12,16,18,24,27,32,36,48,54,64,72,12&lt;/p&gt;
&lt;p&gt;对于3和2的因子也如法炮制,对有重复的数字做个乘法就行了,不要重新算&lt;br /&gt;
结果好小&amp;#8230;答案正确 &lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a name=&quot;pe_problem_153&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;pe_solution&quot;&gt;Problem 153&lt;br /&gt;
&lt;a style=&quot;text-decoration: none;&quot; title=&quot;Click to view problem&quot; href=&quot;http://projecteuler.net/index.php?section=problems&amp;amp;id=153&quot;&gt;Investigating Gaussian Integers&lt;/a&gt;&lt;br /&gt;
定义&lt;a href=&quot;http://en.wikipedia.org/wiki/Gaussian_integer&quot;&gt;高斯整数&lt;/a&gt;为实部和虚部都是整数的复数&lt;br /&gt;
定义若高斯整数a和高斯整数b满足b/a也是高斯整数,那么称a能整除b&lt;br /&gt;
s(n)表示所有能整除n的实部为正的高斯整数的和(即满足n/x是高斯整数的x的和)&lt;br /&gt;
求sum{s(n) ,n=1..10^8} &lt;/p&gt;
&lt;p&gt;&amp;#8211;下面的除法是整数除法&lt;br /&gt;
设s(n)=sr(n)+si(n),其中sr(n)表示整数部分的和,si(n)表示虚部不为0的复数部分的和&lt;br /&gt;
整数部分的话,很简单&lt;/p&gt;
&lt;pre&gt;sum{sr(n),n=1..N}=sum{(N/n)*n,n=1..N} &lt;/pre&gt;
&lt;p&gt;可以优化一下用O(sqrt(N))的复杂度算出来&lt;/p&gt;
&lt;p&gt;不过复数不太好办&lt;br /&gt;
设最小的能被a+bi整除的正整数是m(a,b)&lt;/p&gt;
&lt;pre&gt;
m(a,b)/(a+bi)=m(a,b)*(a-bi)/(a&lt;sup&gt;2&lt;/sup&gt;+b&lt;sup&gt;2&lt;/sup&gt;)
因此
m(a,b)=(a&lt;sup&gt;2&lt;/sup&gt;+b&lt;sup&gt;2&lt;/sup&gt;)/gcd(a,b)
&lt;/pre&gt;
&lt;p&gt;于是能被a+bi整除的正整数必须是m(a,b)的倍数&lt;br /&gt;
共轭复数是成对出现的,即a+bi可以整除n的话a-bi也可以,而加起来正好是2*a,虚部被抵消了&lt;br /&gt;
因此只计算b&gt;0的情况就行了&lt;/p&gt;
&lt;pre&gt;si(n)=2*sum{a| n%m(a,b)==0, b&gt;0}&lt;/pre&gt;
&lt;p&gt;分成a=b,a&amp;lt;b和a&gt;b的的情况讨论得到&lt;/p&gt;
&lt;pre&gt;si(n)=2*sum{a| n%(2*a)==0}+2*sum{a+b| n%m(a,b)==0,a&gt;b&gt;0}&lt;/pre&gt;
&lt;p&gt;求和后就成了&lt;/p&gt;
&lt;pre&gt;sum{si(n),n=1..N}=2*sum{(N/(2*a))*a| a=1..N}+2*sum{(N/m(a,b))*(a+b)| 0&amp;lt;b&amp;lt;a&amp;le;N}&lt;/pre&gt;
&lt;p&gt;前半部分和之前算整数部分之和的方法差不多,后半部分怎么办呢&lt;br /&gt;
可以开个10^8大的数组,r[i]记录N/i的系数&lt;br /&gt;
对每个0&amp;lt;b&amp;lt;a&amp;lt;sqrt(N) ,gcd(a,b)=1的(a,b),给r[(a*a+b*b)*k]+=(a+b)*2*k&lt;br /&gt;
相信只有O(N)个这样的项需要处理,gcd复杂度算是O(logN)那么总复杂度是O(N*logN)&lt;/p&gt;
&lt;p&gt;感觉内存用的太多,空间复杂度应该可以简化到O(sqrt(N))级别的&lt;br /&gt;
r0[1..sqrt(N)]记录N/i的系数&lt;br /&gt;
r1[1..sqrt(N)]记录N/k=i的系数&lt;/p&gt;
&lt;p&gt;内存消耗不到1MB,耗时20秒&lt;br /&gt;
答案正确
&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;&lt;a name=&quot;pe_problem_154&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;pe_solution&quot;&gt;Problem 154&lt;br /&gt;
&lt;a style=&quot;text-decoration: none;&quot; title=&quot;Click to view problem&quot; href=&quot;http://projecteuler.net/index.php?section=problems&amp;amp;id=154&quot;&gt;Exploring Pascal&amp;#8217;s pyramid.&lt;/a&gt;&lt;br /&gt;
金字塔形堆放的球,顶端的球数字为1,其他球的数字是它上面相邻的3个球的数字之和&lt;br /&gt;
也就是每个球上的数字是三项式(x+y+z)&lt;sup&gt;n&lt;/sup&gt;展开后的系数&lt;br /&gt;
问(x+y+z)&lt;sup&gt;200000&lt;/sup&gt; 中有多少个系数是10&lt;sup&gt;12&lt;/sup&gt;的整数倍&lt;/p&gt;
&lt;p&gt;让人想起&lt;a href=&quot;http://www.ben1222.com/wordpress/archives/32468#pe_problem_148&quot;&gt;Problem 148&lt;/a&gt;&amp;#8230;不过又是3维又不是质数&amp;#8230;&lt;br /&gt;
先展开多项式吧&lt;br /&gt;
设w=x+y,那么 &lt;/p&gt;
&lt;pre&gt;
(x+y+z)&lt;sup&gt;n&lt;/sup&gt;=(w+z)&lt;sup&gt;n&lt;/sup&gt;=sum{C(n,i)*w&lt;sup&gt;i&lt;/sup&gt;*z&lt;sup&gt;(n-i)&lt;/sup&gt;}
	=sum{C(n,i)*(x+y)&lt;sup&gt;i&lt;/sup&gt;*z&lt;sup&gt;(n-i)&lt;/sup&gt;}
	=sum{C(n,i)*C(i,j)*x&lt;sup&gt;j&lt;/sup&gt;*y&lt;sup&gt;(i-j)&lt;/sup&gt;*z&lt;sup&gt;(n-i)&lt;/sup&gt;}
&lt;/pre&gt;
&lt;p&gt;设a=j,b=i-j,c=n-i,分别表示x,y,z的幂次 &lt;/p&gt;
&lt;pre&gt;
C(n,i)*C(i,j)=n!*i!/(i!*(n-i)!*j!*(i-j)!)
	=n!/(a!*b!*c!)
&lt;/pre&gt;
&lt;p&gt;要求这个系数是10&lt;sup&gt;12&lt;/sup&gt;的整数倍啊&amp;#8230;&lt;br /&gt;
就是看这个数中2的幂次和5的幂次哪个低咯&amp;#8230;低的那个达到12就ok&lt;br /&gt;
1~n每个数的阶乘的2的幂次和5的幂次都可以预处理下&lt;br /&gt;
枚举a和b,c=n-a-b,复杂度是O(n^2)&amp;#8230;虽然不是不能接受&amp;#8230;但是不是有点慢&amp;#8230;&lt;/p&gt;
&lt;p&gt;尝试从小数据中找规律&amp;#8230;结果失败了&amp;#8230;&lt;br /&gt;
&lt;a href=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2011/05/PE_154.gif&quot;&gt;&lt;img src=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2011/05/PE_154.gif&quot; alt=&quot;&quot; title=&quot;PE_154&quot; width=&quot;280&quot; height=&quot;260&quot; class=&quot;alignnone size-full wp-image-32531&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;那就看看能不能做些常数优化&amp;#8230;&lt;br /&gt;
设a&lt;=b&lt;=c,减少计算次数&lt;br /&gt;
枚举范围是a=[0,n/3],b=[a,(n-a)/2]&lt;br /&gt;
那么a,b,c都不相等的时候,n!/(a!*b!*c!)值共出现了6次&lt;br /&gt;
a=b或者b=c的时候,出现3次&lt;br /&gt;
a=b=c的时候,出现1次&lt;/p&gt;
&lt;p&gt;34秒,答案正确
&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;&lt;a name=&quot;pe_problem_155&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;pe_solution&quot;&gt;Problem 155&lt;br /&gt;
&lt;a style=&quot;text-decoration: none;&quot; title=&quot;Click to view problem&quot; href=&quot;http://projecteuler.net/index.php?section=problems&amp;amp;id=155&quot;&gt;Counting Capacitor Circuits.&lt;/a&gt;&lt;br /&gt;
设D(n)表示最多用n个相同容量的电容串联并联等能组成多少种不同的电容值&lt;br /&gt;
求D(18) &lt;/p&gt;
&lt;p&gt;写个处理分数的类&amp;#8230;然后暴力&lt;br /&gt;
设c(n)表示用n个相同容量的电容可以组成哪些电容值&lt;br /&gt;
那么枚举c(i),c(n-1)两两配对进行串联或并联,然后排序去重&amp;#8230;&lt;br /&gt;
48秒&lt;br /&gt;
答案正确
&lt;/p&gt;&lt;/div&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/507215658/AC_ben1222/feedsky/s.gif?r=http://www.ben1222.com/wordpress/archives/32530&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/AC_ben1222/507215658/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/AC_ben1222/507215658/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.ben1222.com/wordpress/archives/32530/feed</wfw:commentRss><slash:comments>0</slash:comments><description>最近好像没什么干劲啊&amp;#8230;
Project Euler
Problem 151 : C++,裁纸,数学期望
Problem 152 : C++,1/2用整数的平方的倒数的和来表示的方法数
Problem 153 : C++,整除n的高斯整数之和
Problem 154 : C++,(x+y+z)200000 中有多少个系数是1012的整数倍
Problem 155 : C++,用18个相同容量的电容串联并联等能组成多少种不同的电容值
下面是详细内容:


Problem 151
Paper sheets of standard sizes: an expected-value problem.
Project Euler 151
一开始只有一张A1的纸,每次随机取出一张纸
如果不是A5则按题意切,切完拿走一张A5,其余放回
如果是A5则拿走
除去第一次和最后一次,拿的时候发现只剩一张纸的次数的数学期望是多少 
每个状态算一遍就行了
对每一天来说,记录 {各大小纸张的数量,至今为止遇到只剩一张纸的情况的次数} = 出现概率
状态不多,用map就够用了
从第一天开始依次计算下一天的所有状态的出现概率
然后(概率*次数)求和即可


Problem 152
Writing 1/2 as a sum of inverse squares
把1/2表示成许多不同整数的平方的倒数的和
求从2~80这几个整数取数,按上述计算,有多少种方法表示1/2 
既然最后要表示成1/2,那么分母中除了2以外的质数因子都要能消除才行
怎么才能消除呢&amp;#8230;
1/a+1/b=(a+b)/(a*b)
如果a和b互质的话,(a+b)和(a*b)也互质
c/a+d/b=(b*c+a*d)/(a*b)
如果a和b互质且c/a和d/b是既约分数的话,(b*c+a*d)和(a*b)也互质&amp;#8230;
因此为了消除分母上的某个质因子,这个质因子至少要在两项中出现
分母只能取2~80的平方,超过40的质数最多只有一个&amp;#8230;所以这些数就不考虑了
而超过7的质数之间又是不相关的(2~80中没有哪个数是两个超过7的质数的积)
既然是不相关的就可以单独拿出来看看&amp;#8230;能有哪几种消除该质数因子的方法
写段程序检测下来发现含有大于7的质数的因子的数中只有这么一组可以消除该质数的:

	1/144=1/169+1/1521+1/2704=1/132+1/392+1/522

那么还剩下39个数: 
2,3,4,5,6,7,8,9,10,12,14,15,16,18,20,21,24,25,27,28,
30,32,35,36,40,42,45,48,49,50,54,56,60,63,64,70,72,75,80
算上1/144这个,还剩40个数,其中12出现2次 
既然这结果这么好,那么带7这个因子的数也拿来组合一下试试&amp;#8230;
这下就有好多种消除质因子7的组合了,有19个
剩下的数字有30个: 
2,3,4,5,6,8,9,10,12,15,16,18,20,24,25,27,
30,32,36,40,45,48,50,54,60,64,72,75,80,12
本来以为这19个组合里面如果两两没有交集的话,还要考虑选取这2个的情况
实际上多虑了,因为两个都选取的情况已经包含在这些组合里面了 
那么在这19个数任取一个或者一个都不取&amp;#8230;然后和带有5的因子的数组合起来看看消除5这个因子有多少种组合
有475个组合,其中不相同的数有252个
还剩18个数字:
2,3,4,6,8,9,12,16,18,24,27,32,36,48,54,64,72,12
对于3和2的因子也如法炮制,对有重复的数字做个乘法就行了,不要重新算
结果好小&amp;#8230;答案正确 


Problem 153
Investigating Gaussian Integers
定义高斯整数为实部和虚部都是整数的复数
定义若高斯整数a和高斯整数b满足b/a也是高斯整数,那么称a能整除b
s(n)表示所有能整除n的实部为正的高斯整数的和(即满足n/x是高斯整数的x的和)
求sum{s(n) ,n=1..10^8} 
&amp;#8211;下面的除法是整数除法
设s(n)=sr(n)+si(n),其中sr(n)表示整数部分的和,si(n)表示虚部不为0的复数部分的和
整数部分的话,很简单
sum{sr(n),n=1..N}=sum{(N/n)*n,n=1..N} 
可以优化一下用O(sqrt(N))的复杂度算出来
不过复数不太好办
设最小的能被a+bi整除的正整数是m(a,b)

m(a,b)/(a+bi)=m(a,b)*(a-bi)/(a2+b2)
因此
m(a,b)=(a2+b2)/gcd(a,b)

于是能被a+bi整除的正整数必须是m(a,b)的倍数
共轭复数是成对出现的,即a+bi可以整除n的话a-bi也可以,而加起来正好是2*a,虚部被抵消了
因此只计算b&gt;0的情况就行了
si(n)=2*sum{a&amp;#124; n%m(a,b)==0, b&gt;0}
分成a=b,a&amp;#60;b和a&gt;b的的情况讨论得到
si(n)=2*sum{a&amp;#124; n%(2*a)==0}+2*sum{a+b&amp;#124; [...]&lt;img src=&quot;http://www1.feedsky.com/t1/507215658/AC_ben1222/feedsky/s.gif?r=http://www.ben1222.com/wordpress/archives/32530&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/AC_ben1222/507215658/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/AC_ben1222/507215658/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description><category>多项式</category><category>Project Euler</category><category>期望</category><category>枚举</category><category>数学</category><pubDate>Sun, 01 May 2011 13:34:54 +0800</pubDate><author>ben1222</author><comments>http://www.ben1222.com/wordpress/archives/32530#comments</comments><guid isPermaLink="false">http://www.ben1222.com/wordpress/?p=32530</guid><dc:creator>ben1222</dc:creator><fs:srclink>http://www.ben1222.com/wordpress/archives/32530</fs:srclink><fs:srcfeed>http://www.ben1222.com/wordpress/feed</fs:srcfeed><fs:itemid>feedsky/AC_ben1222/~8105908/507215658/5755039</fs:itemid></item><item><title>大数取余(二) 剩余定理</title><link>http://www.ben1222.com/wordpress/archives/32525</link><content:encoded>&lt;p&gt;&lt;a href=&quot;http://www.ben1222.com/wordpress/archives/32356&quot;&gt;上次的文章&lt;/a&gt;中主要说的都是各种运算对应的取余的计算方式&lt;br /&gt;
但是没有提到关于模数的优化&lt;/p&gt;
&lt;p&gt;计算a%m时,如果m能小一些的话,通常计算起来就会方便很多&lt;br /&gt;
比如可以用更小的内存进行预处理,或者找到循环节之类的很好的东西&lt;/p&gt;
&lt;p&gt;在做了&lt;a href=&quot;http://projecteuler.net/index.php?section=problems&amp;#038;id=330&quot;&gt;Project Euler 330&lt;/a&gt;后深刻的感受到了这点&amp;#8230;&lt;br /&gt;
题中要求对77777777取模,可以看到这和平时常用的对某个质数取模不同,这回是个合数&lt;br /&gt;
77777777 = 7 * 11 * 73 * 101 * 137&lt;br /&gt;
在过去,看到要对合数取模感觉就不太爽,因为有些性质只有质数才能用,比如组合数取模&lt;/p&gt;
&lt;p&gt;这题搞了很久没有进展才想起来还有个&lt;a href=&quot;http://zh.wikipedia.org/wiki/%E4%B8%AD%E5%9B%BD%E5%89%A9%E4%BD%99%E5%AE%9A%E7%90%86&quot;&gt;剩余定理&lt;/a&gt;&lt;br /&gt;
对于两两互质的一组整数{m&lt;sub&gt;1&lt;/sub&gt;,m&lt;sub&gt;2&lt;/sub&gt;,&amp;#8230;,m&lt;sub&gt;n&lt;/sub&gt;}&lt;br /&gt;
设m=m&lt;sub&gt;1&lt;/sub&gt;*m&lt;sub&gt;2&lt;/sub&gt;*&amp;#8230;*m&lt;sub&gt;n&lt;/sub&gt;, 也就是m是这组数的乘积&lt;br /&gt;
设b&lt;sub&gt;i&lt;/sub&gt;=a%m&lt;sub&gt;i&lt;/sub&gt;, 也就是b&lt;sub&gt;i&lt;/sub&gt;是a对m&lt;sub&gt;i&lt;/sub&gt;取余的余数&lt;br /&gt;
已知{b&lt;sub&gt;1&lt;/sub&gt;,b&lt;sub&gt;2&lt;/sub&gt;,&amp;#8230;,b&lt;sub&gt;n&lt;/sub&gt;}的话,可以求得a%m&lt;br /&gt;
具体做法是找到c&lt;sub&gt;i&lt;/sub&gt;=(m/m&lt;sub&gt;i&lt;/sub&gt;)*k使得c&lt;sub&gt;i&lt;/sub&gt;%m&lt;sub&gt;i&lt;/sub&gt;==1&lt;br /&gt;
因为两两互质,所以k只要枚举1~m&lt;sub&gt;i&lt;/sub&gt;-1就一定能找到满足条件的c&lt;sub&gt;i&lt;/sub&gt;&lt;br /&gt;
最后a%m=sum{c&lt;sub&gt;i&lt;/sub&gt;*b&lt;sub&gt;i&lt;/sub&gt;}%m&lt;/p&gt;
&lt;p&gt;因此当m可以分解质因数时可以分成两两互质的一组数,然后通过计算b&lt;sub&gt;i&lt;/sub&gt;来得到a%m&lt;br /&gt;
这样做有2个好处&lt;br /&gt;
一个是有可能得到m&lt;sub&gt;i&lt;/sub&gt;是质数,可以应用质数所特有的方法&lt;br /&gt;
另一个是模数小了,这样如果有循环节的话就更容易发现,这就更爽了&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/507215659/AC_ben1222/feedsky/s.gif?r=http://www.ben1222.com/wordpress/archives/32525&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/AC_ben1222/507215659/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/AC_ben1222/507215659/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.ben1222.com/wordpress/archives/32525/feed</wfw:commentRss><slash:comments>1</slash:comments><description>上次的文章中主要说的都是各种运算对应的取余的计算方式
但是没有提到关于模数的优化
计算a%m时,如果m能小一些的话,通常计算起来就会方便很多
比如可以用更小的内存进行预处理,或者找到循环节之类的很好的东西
在做了Project Euler 330后深刻的感受到了这点&amp;#8230;
题中要求对77777777取模,可以看到这和平时常用的对某个质数取模不同,这回是个合数
77777777 = 7 * 11 * 73 * 101 * 137
在过去,看到要对合数取模感觉就不太爽,因为有些性质只有质数才能用,比如组合数取模
这题搞了很久没有进展才想起来还有个剩余定理
对于两两互质的一组整数{m1,m2,&amp;#8230;,mn}
设m=m1*m2*&amp;#8230;*mn, 也就是m是这组数的乘积
设bi=a%mi, 也就是bi是a对mi取余的余数
已知{b1,b2,&amp;#8230;,bn}的话,可以求得a%m
具体做法是找到ci=(m/mi)*k使得ci%mi==1
因为两两互质,所以k只要枚举1~mi-1就一定能找到满足条件的ci
最后a%m=sum{ci*bi}%m
因此当m可以分解质因数时可以分成两两互质的一组数,然后通过计算bi来得到a%m
这样做有2个好处
一个是有可能得到mi是质数,可以应用质数所特有的方法
另一个是模数小了,这样如果有循环节的话就更容易发现,这就更爽了&lt;img src=&quot;http://www1.feedsky.com/t1/507215659/AC_ben1222/feedsky/s.gif?r=http://www.ben1222.com/wordpress/archives/32525&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/AC_ben1222/507215659/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/AC_ben1222/507215659/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description><category>模板</category><category>大数</category><category>数学</category><pubDate>Thu, 07 Apr 2011 21:06:50 +0800</pubDate><author>ben1222</author><comments>http://www.ben1222.com/wordpress/archives/32525#comments</comments><guid isPermaLink="false">http://www.ben1222.com/wordpress/?p=32525</guid><dc:creator>ben1222</dc:creator><fs:srclink>http://www.ben1222.com/wordpress/archives/32525</fs:srclink><fs:srcfeed>http://www.ben1222.com/wordpress/feed</fs:srcfeed><fs:itemid>feedsky/AC_ben1222/~8105908/507215659/5755039</fs:itemid></item><item><title>define型计算几何模板</title><link>http://www.ben1222.com/wordpress/archives/32483</link><content:encoded>&lt;p&gt;本想在寒假期间写点什么的&amp;#8230;无奈域名出了点问题&amp;#8230;&lt;br /&gt;
导致这一个半月里面网站一直处于无法访问的状态&amp;#8230;&lt;/p&gt;
&lt;p&gt;想起以前积累的计算几何模板&amp;#8230;想差不多可以整理下发出来&amp;#8230;&lt;br /&gt;
不过充斥着define&amp;#8230;以及define的奇怪用法&amp;#8230;可以说完全是C语言风格的代码&amp;#8230;&lt;br /&gt;
总之这是一个基于数组和define而不是类和template的模板&amp;#8230;会有人看吗&amp;#8230;&lt;/p&gt;
&lt;p&gt;如果每段代码都注解出一步步怎么得到的话&amp;#8230;工程浩大&amp;#8230;&lt;br /&gt;
结果心血来潮&amp;#8230;给几乎每段代码画了个图片&amp;#8230;&lt;br /&gt;
蓝色是已知,红色是所求&amp;#8230;&lt;br /&gt;
画了几个才发现&amp;#8230;有些还真难用图片表达啊&amp;#8230;&lt;/p&gt;
&lt;p&gt;那么就开始吧&amp;#8230;&lt;br /&gt;
&lt;span id=&quot;more-32483&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;style&gt;font.rem{color:#0a0;}&lt;/style&gt;
&lt;p&gt;先是关于点,线,圆的形式的说明&lt;/p&gt;
&lt;pre&gt;
说明:
point,p,vector,v,点,向量:
  array[2]  [0]:x,dx  [1]:y,dy
line,vl,直线:
  array[3]  [0]:a  [1]:b  [2]:c
  对应直线方程ax+by+c=0
circle,o,圆:
  array[3]  [0]:x  [1]:y  [2]:r
&lt;/pre&gt;
&lt;p&gt;&lt;a name=&quot;constant&quot;&gt;&lt;/a&gt;&lt;br /&gt;
常量:圆周率和微小值&lt;/p&gt;
&lt;pre&gt;
#define PI 3.14159265358979
#define EPS 1e-10
&lt;/pre&gt;
&lt;p&gt;&lt;a name=&quot;vector&quot;&gt;&lt;/a&gt;&lt;br /&gt;
然后是向量运算&lt;/p&gt;
&lt;pre&gt;
#define IM(v1,v2) (v1[0]*v2[0]+v1[1]*v2[1])
#define IM2(ps1,pe1,ps2,pe2) ((pe1[0]-ps1[0])*(pe2[0]-ps2[0])+(pe1[1]-ps1[1])*(pe2[1]-ps2[1]))
&lt;font class=&quot;rem&quot;&gt;/* 外积大于0,则v2在v1左手方向 */&lt;/font&gt;
#define OM(v1,v2) (v1[0]*v2[1]-v1[1]*v2[0])
#define OM2(ps1,pe1,ps2,pe2) ((pe1[0]-ps1[0])*(pe2[1]-ps2[1])-(pe1[1]-ps1[1])*(pe2[0]-ps2[0]))
#define SU(v1,v2,v3) v3[0]=v2[0]-v1[0];v3[1]=v2[1]-v1[1];
&lt;/pre&gt;
&lt;p&gt;&lt;a name=&quot;distance&quot;&gt;&lt;/a&gt;&lt;br /&gt;
距离:&lt;/p&gt;
&lt;pre&gt;
&lt;font class=&quot;rem&quot;&gt;/*两点间距离平方*/&lt;/font&gt;
#define DIS2(p1,p2,ret) {double __v[2];SU(p1,p2,__v) ret=IM(__v,__v);}
&lt;font class=&quot;rem&quot;&gt;/*两点间距离*/&lt;/font&gt;
double dis(long*p1,long*p2){
	double v[2];
	SU(p1,p2,v);
	return sqrt(IM(v,v));
}
&lt;/pre&gt;
&lt;p&gt;&lt;a name=&quot;circle&quot;&gt;&lt;/a&gt;&lt;br /&gt;
关于圆:&lt;br /&gt;
三点求圆心:&lt;/p&gt;
&lt;pre&gt;
&lt;a href=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2011/02/cg_p3o.png&quot;&gt;&lt;img src=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2011/02/cg_p3o.png&quot; alt=&quot;&quot; title=&quot;cg_p3o&quot; width=&quot;64&quot; height=&quot;64&quot; class=&quot;alignright size-full wp-image-32499&quot; /&gt;&lt;/a&gt;
&lt;font class=&quot;rem&quot;&gt;/* 三点求圆心 */&lt;/font&gt;
#define SQS(n,d) n=(d)*(d)
#define ARCC(x1,y1,x2,y2,x3,y3,x0,y0) {\
	double SQS(__y1,y1),SQS(__y2,y2),SQS(__y3,y3),SQS(__x1,x1),SQS(__x2,x2),SQS(__x3,x3); \
	x0=((y3-y1)*(__y2-__y1+__x2-__x1)+(y2-y1)*(__y1-__y3+__x1-__x3))*0.5/ \
		(double)((x2-x1)*(y3-y1)-(x3-x1)*(y2-y1)); \
	y0=((x3-x1)*(__x2-__x1+__y2-__y1)+(x2-x1)*(__x1-__x3+__y1-__y3))*0.5/ \
		(double)((y2-y1)*(x3-x1)-(y3-y1)*(x2-x1));}
#define ARCCP(p1,p2,p3,pc) ARCC(p1[0],p1[1],p2[0],p2[1],p3[0],p3[1],pc[0],pc[1])
&lt;/pre&gt;
&lt;p&gt;两点和直径求圆心:&lt;/p&gt;
&lt;pre&gt;
&lt;a href=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2011/02/cg_p2ro.png&quot;&gt;&lt;img src=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2011/02/cg_p2ro.png&quot; alt=&quot;&quot; title=&quot;cg_p2ro&quot; width=&quot;64&quot; height=&quot;64&quot; class=&quot;alignright size-full wp-image-32501&quot; /&gt;&lt;/a&gt;
&lt;font class=&quot;rem&quot;&gt;/*
给定圆上两点和圆的直径求2个候选的圆心位置,不判断两点间距离是否超过直径
使用:math.h
*/&lt;/font&gt;
#define PDCC(x1,y1,x2,y2,d,rx1,ry1,rx2,ry2) {\
	double SQS(_x,x2-x1),SQS(_y,y2-y1);\
	double _u=sqrt(d*d/(_x+_y)-1);\
	rx1=((x1+x2)+(y2-y1)*_u)/2;\
	ry1=((y1+y2)-(x2-x1)*_u)/2;\
	rx2=((x1+x2)-(y2-y1)*_u)/2;\
	ry2=((y1+y2)+(x2-x1)*_u)/2;}
#define PDCCP(p1,p2,d,r1,r2) PDCC(p1[0],p1[1],p2[0],p2[1],d,r1[0],r1[1],r2[0],r2[1])
&lt;/pre&gt;
&lt;p&gt;圆外一点到圆的切点:&lt;/p&gt;
&lt;pre&gt;
&lt;a href=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2011/02/cg_pot.png&quot;&gt;&lt;img src=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2011/02/cg_pot.png&quot; alt=&quot;&quot; title=&quot;cg_pot&quot; width=&quot;64&quot; height=&quot;64&quot; class=&quot;alignright size-full wp-image-32502&quot; /&gt;&lt;/a&gt;
&lt;font class=&quot;rem&quot;&gt;/*
求圆外一点到圆的2条切线的2个切点
po是圆心坐标,pp是圆外的一点,r是圆的半径,ret1和ret2存放2个切点坐标
不检测点是否在圆内
使用:&lt;a href=&quot;#vector&quot;&gt;向量运算&lt;/a&gt;,math.h
*/&lt;/font&gt;
#define TPC(p1,op,p2) (po[p1]+r*(r*d1[p1] op d1[p2]*sd)/s1)
void tanpoint(double*po,double*pp,double r,double*ret1,double*ret2){
	double d1[2],s1,sd;
	SU(po,pp,d1)
	s1=IM(d1,d1);
	sd=s1-r*r;
	if(sd&amp;lt;0)sd=-sd;
	sd=sqrt(sd);
	ret1[0]=TPC(0,+,1);
	ret1[1]=TPC(1,-,0);
	ret2[0]=TPC(0,-,1);
	ret2[1]=TPC(1,+,0);
}
&lt;/pre&gt;
&lt;p&gt;圆相交面积:&lt;/p&gt;
&lt;pre&gt;
&lt;a href=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2011/02/cg_circle_ins.png&quot;&gt;&lt;img src=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2011/02/cg_circle_ins.png&quot; alt=&quot;&quot; title=&quot;cg_circle_ins&quot; width=&quot;64&quot; height=&quot;64&quot; class=&quot;alignright size-full wp-image-32503&quot; /&gt;&lt;/a&gt;
&lt;font class=&quot;rem&quot;&gt;/*
圆相交面积
使用:&lt;a href=&quot;#vector&quot;&gt;向量运算&lt;/a&gt;,&lt;a href=&quot;#distance&quot;&gt;距离&lt;/a&gt;,&lt;a href=&quot;#constant&quot;&gt;常量&lt;/a&gt;,math.h
*/&lt;/font&gt;
double cosine(double b1, double b2, double b3){
	double b = b2 * b2 + b3 * b3 - b1 * b1;
	return b / b2 / b3 / 2;
}
double circle_ins(double*o1,double*o2){
	double dc=dis(o1,o2),r2=(o1[2]&gt;o2[2]?o1[2]:o2[2]),r1=(o1[2]&amp;lt;o2[2]?o1[2]:o2[2]);
	if(r2-r1&gt;=dc)return PI*r1*r1;
	else if(dc&gt;=r2+r1)return 0;
	else{
		double a1,a2,ang1,ang2,ret=0,s1=PI*r1*r1,s2=PI*r2*r2;
		a1=cosine(r2,r1,dc);
		a2=cosine(r1,r2,dc);
		ang1=acos(a1);
		ang2=acos(a2);
		if(a1&gt;0)ret=(r1*r1*ang1-r1*r1*sin(ang1*2)/2);
		else ret=(r1*r1*ang1+r1*r1*sin((PI-ang1)*2)/2);
		if(a2&gt;0)ret+=(r2*r2*ang2-r2*r2*sin(ang2*2)/2);
		else ret+=(r2*r2*ang2+r2*r2*sin((PI-ang2)*2)/2);
		return ret;
	}
}
&lt;/pre&gt;
&lt;p&gt;&lt;a name=&quot;line&quot;&gt;&lt;/a&gt;&lt;br /&gt;
关于直线:&lt;br /&gt;
&lt;a name=&quot;cg_pt_line&quot;&gt;&lt;/a&gt;直线解析式:&lt;/p&gt;
&lt;pre&gt;
&lt;a href=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2011/02/cg_pt_line.png&quot;&gt;&lt;img src=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2011/02/cg_pt_line.png&quot; alt=&quot;&quot; title=&quot;cg_pt_line&quot; width=&quot;64&quot; height=&quot;64&quot; class=&quot;alignright size-full wp-image-32504&quot; /&gt;&lt;/a&gt;
&lt;font class=&quot;rem&quot;&gt;/*
给定两点,求其所在直线的解析式
ret[0]=a,ret[1]=b,ret[2]=c
ax+by+c=0
使用:&lt;a href=&quot;#vector&quot;&gt;向量运算&lt;/a&gt;
*/&lt;/font&gt;
#define PT_LINE(p1,p2,ret) {ret[1]=p2[0]-p1[0];ret[0]=p1[1]-p2[1];ret[2]=-IM(p1,ret);}
&lt;/pre&gt;
&lt;p&gt;点关于直线的对称点:&lt;/p&gt;
&lt;pre&gt;
&lt;a href=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2011/02/cg_pl_sym.png&quot;&gt;&lt;img src=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2011/02/cg_pl_sym.png&quot; alt=&quot;&quot; title=&quot;cg_pl_sym&quot; width=&quot;64&quot; height=&quot;64&quot; class=&quot;alignright size-full wp-image-32505&quot; /&gt;&lt;/a&gt;
&lt;font class=&quot;rem&quot;&gt;/*
点关于直线的对称点
vl:直线解析式,pt:点,ret:返回对称点
使用:&lt;a href=&quot;#vector&quot;&gt;向量运算&lt;/a&gt;
*/&lt;/font&gt;
#define PL_SYM(vl,pt,ret) {\
	double __d=IM(vl,vl); \
	ret[0]=((vl[1]*vl[1]-vl[0]*vl[0])*pt[0]-2*vl[0]*(vl[1]*pt[1]+vl[2]))/__d; \
	ret[1]=((vl[0]*vl[0]-vl[1]*vl[1])*pt[1]-2*vl[1]*(vl[0]*pt[0]+vl[2]))/__d;}
&lt;/pre&gt;
&lt;p&gt;直线交点:&lt;/p&gt;
&lt;pre&gt;
&lt;a href=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2011/02/cg_line_ins.png&quot;&gt;&lt;img src=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2011/02/cg_line_ins.png&quot; alt=&quot;&quot; title=&quot;cg_line_ins&quot; width=&quot;64&quot; height=&quot;64&quot; class=&quot;alignright size-full wp-image-32506&quot; /&gt;&lt;/a&gt;
&lt;font class=&quot;rem&quot;&gt;/*
判断两条直线[ps1,pe1],[ps2,pe2]的交点情况:
	0:平行 1:相交 2:重叠
如果有交点,返回值在ret中
使用:&lt;a href=&quot;#vector&quot;&gt;向量运算&lt;/a&gt;
*/&lt;/font&gt;
long lineins(long*ps1,long*pe1,long*ps2,long*pe2,double*ret){
	long v1[2],v2[2];
	v1[0]=pe1[0]-ps1[0];v1[1]=pe1[1]-ps1[1];
	v2[0]=pe2[0]-ps2[0];v2[1]=pe2[1]-ps2[1];
	long mul=OM(v1,v2);
	if(mul==0){
		v2[0]=pe2[0]-ps1[0];
		v2[1]=pe2[1]-ps1[1];
		return (OM(v1,v2)==0)?2:0;
	}else{
		double t=((ps2[0]-ps1[0])*v2[1]+(ps1[1]-ps2[1])*v2[0])/(double)mul;
		ret[0]=ps1[0]+v1[0]*t;
		ret[1]=ps1[1]+v1[1]*t;
		return 1;
	}
}
&lt;/pre&gt;
&lt;p&gt;&lt;a name=&quot;cg_dis2pl&quot;&gt;&lt;/a&gt;点到直线的距离:&lt;/p&gt;
&lt;pre&gt;
&lt;a href=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2011/02/cg_dis2pl.png&quot;&gt;&lt;img src=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2011/02/cg_dis2pl.png&quot; alt=&quot;&quot; title=&quot;cg_dis2pl&quot; width=&quot;64&quot; height=&quot;64&quot; class=&quot;alignright size-full wp-image-32507&quot; /&gt;&lt;/a&gt;
&lt;font class=&quot;rem&quot;&gt;/*
点pt到直线[pl1,pl2]的距离平方
使用:&lt;a href=&quot;#vector&quot;&gt;向量运算&lt;/a&gt;
*/&lt;/font&gt;
double dis2pl(double*pt,double*pl1,double*pl2){
	double v1[2],v2[2];
	SU(pt,pl1,v1)SU(pl1,pl2,v2)
	double om=OM(v1,v2);
	return om*om/IM(v2,v2);
}
&lt;/pre&gt;
&lt;p&gt;&lt;a name=&quot;cg_lcins&quot;&gt;&lt;/a&gt;直线和圆的交点:&lt;/p&gt;
&lt;pre&gt;
&lt;a href=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2011/02/cg_lc_ins.png&quot;&gt;&lt;img src=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2011/02/cg_lc_ins.png&quot; alt=&quot;&quot; title=&quot;cg_lc_ins&quot; width=&quot;64&quot; height=&quot;64&quot; class=&quot;alignright size-full wp-image-32508&quot; /&gt;&lt;/a&gt;
&lt;font class=&quot;rem&quot;&gt;/*
直线[pl1,pl2]与圆[po,r]的交点,返回值为交点个数
ax+by+c=0;
(x-ox)^2+(y-oy)^2=r^2
x=( b(b*ox-a*oy)-a*c土b*sqrt(r^2-dis2pl()^2) )/( a^2+b^2 )
y=( a(a*oy-b*ox)-b*c干a*sqrt(r^2-dis2pl()^2) )/( a^2+b^2 )
使用:&lt;a href=&quot;#vector&quot;&gt;向量运算&lt;/a&gt;,&lt;a href=&quot;#constant&quot;&gt;常量&lt;/a&gt;,&lt;a href=&quot;#cg_pt_line&quot;&gt;直线解析式&lt;/a&gt;,math.h
*/&lt;/font&gt;
long lcins(double*po,double r,double*pl1,double*pl2,double*ret1,double*ret2){
	double vl[3],tmp1,tmp2;
	PT_LINE(pl1,pl2,vl)
	tmp1=IM(vl,po)+vl[2];
	double ab=IM(vl,vl),mdis2=ab*r*r-tmp1*tmp1;
	if(mdis2&amp;lt;=-EPS)return 0;
	else{
		tmp1=(vl[1]*OM(po,vl)-vl[0]*vl[2]);
		tmp2=(vl[0]*OM(vl,po)-vl[1]*vl[2]);
		if(mdis2&amp;lt;EPS){
			ret1[0]=tmp1/ab;ret1[1]=tmp2/ab;
			return 1;
		}else{
			double sq=sqrt(mdis2);
			ret1[0]=(tmp1+vl[1]*sq)/ab;ret1[1]=(tmp2-vl[0]*sq)/ab;
			ret2[0]=(tmp1-vl[1]*sq)/ab;ret2[1]=(tmp2+vl[0]*sq)/ab;
			return 2;
		}
	}
}
&lt;/pre&gt;
&lt;p&gt;直线和椭圆的交点:&lt;/p&gt;
&lt;pre&gt;
&lt;a href=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2011/02/cg_le_ins.png&quot;&gt;&lt;img src=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2011/02/cg_le_ins.png&quot; alt=&quot;&quot; title=&quot;cg_le_ins&quot; width=&quot;64&quot; height=&quot;64&quot; class=&quot;alignright size-full wp-image-32509&quot; /&gt;&lt;/a&gt;
&lt;font class=&quot;rem&quot;&gt;/*
直线[pl1,pl2]与椭圆的交点,返回值为交点个数
ax+by+c=0
(x/d)^2+(y/e)^2=1
x=( -c*ad*d土be*d*sqrt(ad^2+be^2-c^2) )/( ad^2+be^2 )
y=( -c*be*e干ad*e*sqrt(ad^2+be^2-c^2) )/( ad^2+be^2 )
使用:&lt;a href=&quot;#vector&quot;&gt;向量运算&lt;/a&gt;,&lt;a href=&quot;#constant&quot;&gt;常量&lt;/a&gt;,&lt;a href=&quot;#cg_pt_line&quot;&gt;直线解析式&lt;/a&gt;,math.h
*/&lt;/font&gt;
long leins(double d,double e,double*pl1,double*pl2,double*ret1,double*ret2){
	double vl[3];
	PT_LINE(pl1,pl2,vl)
	double ab=vl[0]*vl[0]*d*d+vl[1]*vl[1]*e*e,delta=ab-vl[2]*vl[2];
	if(delta&amp;lt;=-EPS)return 0;
	else if(delta&amp;lt;EPS){
		ret1[0]=-vl[2]*vl[0]*d*d/ab;
		ret1[1]=-vl[2]*vl[1]*e*e/ab;
		return 1;
	}else{
		double sq=sqrt(delta);
		ret1[0]=(-vl[2]*vl[0]*d*d+vl[1]*e*d*sq)/ab;
		ret1[1]=(-vl[2]*vl[1]*e*e-vl[0]*e*d*sq)/ab;
		ret2[0]=(-vl[2]*vl[0]*d*d-vl[1]*e*d*sq)/ab;
		ret2[1]=(-vl[2]*vl[1]*e*e+vl[0]*e*d*sq)/ab;
		return 2;
	}
}
&lt;/pre&gt;
&lt;p&gt;&lt;a name=&quot;segment&quot;&gt;&lt;/a&gt;&lt;br /&gt;
关于线段:&lt;/p&gt;
&lt;pre&gt;
&lt;font class=&quot;rem&quot;&gt;/*
整数点间连一条线,问穿过多少个单位正方形:
	=a+b-gcd(a,b)
扩展到三维:
	=a+b+c-gcd(a,b)-gcd(a,c)-gcd(b,c)+gcd(a,b,c)
*/&lt;/font&gt;
&lt;/pre&gt;
&lt;p&gt;判断线段是否相交:&lt;/p&gt;
&lt;pre&gt;
&lt;a href=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2011/02/cg_seg_ins.png&quot;&gt;&lt;img src=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2011/02/cg_seg_ins.png&quot; alt=&quot;&quot; title=&quot;cg_seg_ins&quot; width=&quot;64&quot; height=&quot;64&quot; class=&quot;alignright size-full wp-image-32510&quot; /&gt;&lt;/a&gt;
&lt;font class=&quot;rem&quot;&gt;/*
判断两线段是否相交,跨立实验中用&gt;则不包括端点,用&gt;=则包括端点
使用:&lt;a href=&quot;#vector&quot;&gt;向量运算&lt;/a&gt;
*/&lt;/font&gt;
#define MAX(a,b) ((a)&gt;(b)?(a):(b))
#define MIN(a,b) ((a)&amp;lt;(b)?(a):(b))
#define MN(a,b,t) (MAX(ps##a[t],pe##a[t])&gt;=MIN(ps##b[t],pe##b[t]))
long segins(long*ps1,long*pe1,long*ps2,long*pe2){
	return MN(1,2,0)&amp;#038;&amp;#038;MN(2,1,0)&amp;#038;&amp;#038;MN(1,2,1)&amp;#038;&amp;#038;MN(2,1,1) &amp;#038;&amp;#038; //快速排斥实验
		(OM2(ps1,ps2,ps1,pe1)*OM2(ps1,pe1,ps1,pe2)&gt;=0) &amp;#038;&amp;#038;
		(OM2(ps2,ps1,ps2,pe2)*OM2(ps2,pe2,ps2,pe1)&gt;=0); //跨立实验
}
&lt;/pre&gt;
&lt;p&gt;点到线段的垂足:&lt;/p&gt;
&lt;pre&gt;
&lt;a href=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2011/02/cg_pl_root.png&quot;&gt;&lt;img src=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2011/02/cg_pl_root.png&quot; alt=&quot;&quot; title=&quot;cg_pl_root&quot; width=&quot;64&quot; height=&quot;64&quot; class=&quot;alignright size-full wp-image-32511&quot; /&gt;&lt;/a&gt;
&lt;font class=&quot;rem&quot;&gt;/*
点pt到线段[ps,pe]所在直线的垂足,返回true表示垂足在线段上,垂足坐标存在ret中
使用:&lt;a href=&quot;#vector&quot;&gt;向量运算&lt;/a&gt;
*/&lt;/font&gt;
long plfoot(double*pt,double*ps,double*pe,double*ret){
	double vt[2],t,ret[2];
	SU(ps,pe,vt)
	t=(-(ps[0]-pt[0])*(pe[0]-ps[0])-(ps[1]-pt[1])*(pe[1]-ps[1]))/IM(vt,vt);
	ret[0]=ps[0]+t*(pe[0]-ps[0]);
	ret[1]=ps[1]+t*(pe[1]-ps[1]);
	return !((ret[0]&amp;lt;ps[0]&amp;#038;&amp;#038;ret[0]&amp;lt;pe[0])||(ret[0]&gt;ps[0]&amp;#038;&amp;#038;ret[0]&gt;pe[0])||
		(ret[1]&amp;lt;ps[1]&amp;#038;&amp;#038;ret[1]&amp;lt;pe[1])||(ret[1]&gt;ps[1]&amp;#038;&amp;#038;ret[1]&gt;pe[1]));
}
&lt;/pre&gt;
&lt;p&gt;点到线段的距离:&lt;/p&gt;
&lt;pre&gt;
&lt;a href=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2011/02/cg_dis2ps.png&quot;&gt;&lt;img src=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2011/02/cg_dis2ps.png&quot; alt=&quot;&quot; title=&quot;cg_dis2ps&quot; width=&quot;64&quot; height=&quot;64&quot; class=&quot;alignright size-full wp-image-32512&quot; /&gt;&lt;/a&gt;
&lt;font class=&quot;rem&quot;&gt;/*
点pt到线段[pl1,pl2]的距离的平方
使用:&lt;a href=&quot;#vector&quot;&gt;向量运算&lt;/a&gt;,&lt;a href=&quot;#constant&quot;&gt;常量&lt;/a&gt;,&lt;a href=&quot;#distance&quot;&gt;距离&lt;/a&gt;,&lt;a href=&quot;#cg_dis2pl&quot;&gt;点到直线距离&lt;/a&gt;
*/&lt;/font&gt;
double dis2ps(double*pt,double*pl1,double*pl2){
	double ret;
	if(IM2(pl1,pt,pl1,pl2)&amp;lt;-EPS)DIS2(pt,pl1,ret)
	else if(IM2(pl2,pt,pl2,pl1)&amp;lt;-EPS)DIS2(pt,pl2,ret)
	else ret=dis2pl(pt,pl1,pl2);
	return ret;
}
&lt;/pre&gt;
&lt;p&gt;角平分线上一点:&lt;/p&gt;
&lt;pre&gt;
&lt;a href=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2011/02/cg_angle_bisector.png&quot;&gt;&lt;img src=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2011/02/cg_angle_bisector.png&quot; alt=&quot;&quot; title=&quot;cg_angle_bisector&quot; width=&quot;64&quot; height=&quot;64&quot; class=&quot;alignright size-full wp-image-32513&quot; /&gt;&lt;/a&gt;
&lt;font class=&quot;rem&quot;&gt;/*
求2个线段[pc,pl]和[pc,pr]组成的夹角的角平分线上的一个点
使用:&lt;a href=&quot;#vector&quot;&gt;向量运算&lt;/a&gt;,math.h
*/&lt;/font&gt;
void hangle(double*pl,double*pc,double*pr,double*ret){
	double vl[2],vr[2];
	SU(pc,pl,vl)
	SU(pc,pr,vr)
	double dl=sqrt(IM(vl,vl)),dr=sqrt(IM(vr,vr));
	vl[0]/=dl;vl[1]/=dl;
	vr[0]/=dr;vr[1]/=dr;
	ret[0]=(vl[0]+vr[0])/2.0+pc[0];
	ret[1]=(vl[1]+vr[1])/2.0+pc[1];
}
&lt;/pre&gt;
&lt;p&gt;&lt;a name=&quot;triangle&quot;&gt;&lt;/a&gt;&lt;br /&gt;
关于三角形:&lt;br /&gt;
三角形面积:&lt;/p&gt;
&lt;pre&gt;
&lt;a href=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2011/02/cg_triangle_area.png&quot;&gt;&lt;img src=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2011/02/cg_triangle_area.png&quot; alt=&quot;&quot; title=&quot;cg_triangle_area&quot; width=&quot;64&quot; height=&quot;64&quot; class=&quot;alignright size-full wp-image-32514&quot; /&gt;&lt;/a&gt;
&lt;font class=&quot;rem&quot;&gt;/*
三角形面积之海伦公式:
p=(a+b+c)/2
s=sqrt((p-a)*(p-b)*(p-c)*p)
*/&lt;/font&gt;
&lt;/pre&gt;
&lt;p&gt;三角形内切圆半径:&lt;/p&gt;
&lt;pre&gt;
&lt;a href=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2011/02/cg_triangle_ic.png&quot;&gt;&lt;img src=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2011/02/cg_triangle_ic.png&quot; alt=&quot;&quot; title=&quot;cg_triangle_ic&quot; width=&quot;64&quot; height=&quot;64&quot; class=&quot;alignright size-full wp-image-32515&quot; /&gt;&lt;/a&gt;
&lt;font class=&quot;rem&quot;&gt;/*
三角形内切圆半径:
直角三角形:r=(a+b-c)/2,其中a,b是直角边长,c是斜边长
一般三角形:r=2S/(a+b+c),其中S是三角形面积
*/&lt;/font&gt;
&lt;/pre&gt;
&lt;p&gt;三角形内周长一定时的最大面积:&lt;/p&gt;
&lt;pre&gt;
&lt;a href=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2011/02/cg_triangle_ma.png&quot;&gt;&lt;img src=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2011/02/cg_triangle_ma.png&quot; alt=&quot;&quot; title=&quot;cg_triangle_ma&quot; width=&quot;64&quot; height=&quot;64&quot; class=&quot;alignright size-full wp-image-32516&quot; /&gt;&lt;/a&gt;
&lt;font class=&quot;rem&quot;&gt;/*
三角形内周长一定的最大面积
triple=x+y+z;
half=triple*0.5;
area=sqrt(half*(half-x)*(half-y)*(half-z));
R=area*2.0/triple;
if(x+y+z&amp;lt;=role)
	max=area;
else if(2.0*PI*R&gt;=role)
	max=role*role/(4.0*PI);
else
{
	r=(triple-role)/(triple/R-2.0*PI);
	max=area+PI*r*r-(r*r*area/(R*R));
}

*/&lt;/font&gt;
&lt;/pre&gt;
&lt;p&gt;三角形重心:&lt;/p&gt;
&lt;pre&gt;
&lt;font class=&quot;rem&quot;&gt;/* 三角形重心 */&lt;/font&gt;
#define CGT(p1,p2,p3,pc) {pc[0]=(p1[0]+p2[0]+p3[0])/3;pc[1]=(p1[1]+p2[1]+p3[1])/3;}
&lt;/pre&gt;
&lt;p&gt;判断点是否在三角形内:&lt;/p&gt;
&lt;pre&gt;
&lt;a href=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2011/02/cg_pint.png&quot;&gt;&lt;img src=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2011/02/cg_pint.png&quot; alt=&quot;&quot; title=&quot;cg_pint&quot; width=&quot;64&quot; height=&quot;64&quot; class=&quot;alignright size-full wp-image-32517&quot; /&gt;&lt;/a&gt;
&lt;font class=&quot;rem&quot;&gt;/*
外积判断点是否在三角形内
在三角形内的返回2,边上的1,外面的0
使用:&lt;a href=&quot;#vector&quot;&gt;向量运算&lt;/a&gt;
*/&lt;/font&gt;
long pint(long*p1,long*p2,long*p3,long*pm){
	long v1[2],v2[2],t,l;
	SU(p1,p2,v1)SU(p1,pm,v2)
	if((t=OM(v1,v2))==0)return 1;
	t=t&gt;0?1:-1;
	SU(p2,p3,v1)SU(p2,pm,v2)
	l=t*OM(v1,v2);
	if(l==0)return 1;else if(l&amp;lt;0)return 0;
	SU(p3,p1,v1)SU(p3,pm,v2)
	l=t*OM(v1,v2);
	if(l==0)return 1;else if(l&amp;lt;0)return 0;
	return 2;
}
&lt;/pre&gt;
&lt;p&gt;三角形内一点到3边的距离的平方和最小:(这个图片我实在想不出怎么画&amp;#8230;)&lt;/p&gt;
&lt;pre&gt;
&lt;font class=&quot;rem&quot;&gt;/*
三角形内一点到3边的距离的平方和最小
void (double pts[3][2])
	double x,y,vl[3][3],d2[3];
	long i;
	for(i=0;i&amp;lt;3;i++){
		PT_LINE(pts[i],pts[(i+1)%3],vl[i]);
		d2[i]=IM(vl[i],vl[i]);
	}
	double X=0,Y=0,C=0,U=0,B=0;
	for(i=0;i&amp;lt;3;i++){
		X+=vl[i][0]*vl[i][1]/d2[i];
		Y+=vl[i][1]*vl[i][1]/d2[i];
		C+=vl[i][1]*vl[i][2]/d2[i];
	}
	for(i=0;i&amp;lt;3;i++){
		double t=vl[i][0]*Y-vl[i][1]*X;
		U+=t*(vl[i][2]*Y-vl[i][1]*C)/d2[i];
		B+=t*t/d2[i];
	}
	x=-U/B;
	y=-(X*x+C)/Y;
*/&lt;/font&gt;
&lt;/pre&gt;
&lt;p&gt;&lt;a name=&quot;rectangle&quot;&gt;&lt;/a&gt;&lt;br /&gt;
判断矩形能否斜放在另一个矩形内:&lt;/p&gt;
&lt;pre&gt;
&lt;a href=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2011/02/cg_rcinrc.png&quot;&gt;&lt;img src=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2011/02/cg_rcinrc.png&quot; alt=&quot;&quot; title=&quot;cg_rcinrc&quot; width=&quot;64&quot; height=&quot;64&quot; class=&quot;alignright size-full wp-image-32518&quot; /&gt;&lt;/a&gt;
&lt;font class=&quot;rem&quot;&gt;/*
判断矩形能否斜放在另一个矩形内
minh=(2xya+d*(x*x-y*y))/(x*x+y*y)  (x&gt;y)
d=sqrt(x*x+y*y-a*a)
return minh&amp;lt;=b

不判断面积大小和快速排斥
使用:math.h
*/&lt;/font&gt;
#define I __int64
long rcinrc(long w1,long h1,long w2,long h2){
	if((w1&amp;lt;h1?w1:h1)&amp;lt;(w2&amp;lt;h2?w2:h2))return 0;
	I sq=(I)w2*(I)w2+(I)h2*(I)h2,l=2*(I)w2*(I)h2*(I)w1,a2=(I)w1*(I)w1;
	if(w2==h2||sq==a2)return l&amp;lt;=sq*h1;
	else{
		if(w2&amp;lt;h2){long t=w2;w2=h2;h2=t;}
		if(sq&amp;lt;a2)return 0;
		I il=((I)w2*(I)w2-(I)h2*(I)h2);
		double dl=l+sqrt((double)(sq-a2))*il,dr=sq*h1;
		return dl&amp;lt;=dr;
	}
}
&lt;/pre&gt;
&lt;p&gt;三角形和圆的公共部分面积:&lt;/p&gt;
&lt;pre&gt;
&lt;a href=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2011/02/cg_c2p.png&quot;&gt;&lt;img src=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2011/02/cg_c2p.png&quot; alt=&quot;&quot; title=&quot;cg_c2p&quot; width=&quot;64&quot; height=&quot;64&quot; class=&quot;alignright size-full wp-image-32519&quot; /&gt;&lt;/a&gt;
&lt;font class=&quot;rem&quot;&gt;/*
点pt在线段[pl1,pl2]的位置
IM2(pl1,pt,pl1,pl2)&amp;lt;-EPS  点在线段外,pl1一侧
IM2(pl2,pt,pl2,pl1)&amp;lt;-EPS  点在线段外,pl2一侧
PTINSEG:点在线段所在直线的前提上,判断点是否在线段内,线段加长一段微小量
PTINSEGS:同上,线段缩小一段微小量
使用:&lt;a href=&quot;#vector&quot;&gt;向量运算&lt;/a&gt;,&lt;a href=&quot;#constant&quot;&gt;常量&lt;/a&gt;
*/&lt;/font&gt;
#define PTINSEG(pt,pl1,pl2) ((IM2(pl1,pt,pl1,pl2)&gt;=-EPS)&amp;#038;&amp;#038;(IM2(pl2,pt,pl2,pl1)&gt;=-EPS))
#define PTINSEGS(pt,pl1,pl2) ((IM2(pl1,pt,pl1,pl2)&gt;EPS)&amp;#038;&amp;#038;(IM2(pl2,pt,pl2,pl1)&gt;EPS))

&lt;font class=&quot;rem&quot;&gt;/*
2点和圆心组成的三角形与这个圆的公共部分面积
r是圆半径,原点是圆心
ps和pe是三角形另外两个点,逆时针为正
使用:&lt;a href=&quot;#vector&quot;&gt;向量运算&lt;/a&gt;,&lt;a href=&quot;#constant&quot;&gt;常量&lt;/a&gt;,&lt;a href=&quot;#cg_lcins&quot;&gt;直线和圆的交点&lt;/a&gt;,math.h
*/&lt;/font&gt;
#define VRAD(v,ret) {if(v[0]==0){if(v[1]&gt;0)ret=PI/2;else ret=PI*3/2;}\
	else{double _t=atan(v[1]/v[0]);if(v[0]&amp;lt;0)_t=PI+_t;ret=(_t&amp;lt;0?_t+PI*2:_t);}}
#define MARC(rad) {if(rad&gt;PI)rad-=PI*2;if(rad&amp;lt;-PI)rad+=PI*2;}
double area_c2p(double r,double*ps,double*pe){
	double d1=IM(ps,ps),d2=IM(pe,pe),r2=r*r;
	if(d1&amp;lt;=r2&amp;#038;&amp;#038;d2&amp;lt;=r2)return OM(ps,pe)/2;
	double rad1,rad2,po[2],ins1[2],ins2[2],drad;
	VRAD(ps,rad1)VRAD(pe,rad2)
	drad=rad2-rad1;MARC(drad)
	po[0]=po[1]=0;
	long nins=lcins(po,r,ps,pe,ins1,ins2);
	if(nins&amp;lt;=1)return drad/2*r*r;
	if((IM2(ps,ins1,ps,pe)&amp;lt;-EPS&amp;#038;&amp;#038;IM2(ps,ins2,ps,pe)&amp;lt;-EPS)||\
		(IM2(pe,ins1,pe,ps)&amp;lt;-EPS&amp;#038;&amp;#038;IM2(pe,ins2,pe,ps)&amp;lt;-EPS))return drad/2*r*r;
	else if(PTINSEG(ins1,ps,pe)&amp;#038;&amp;#038;PTINSEG(ins2,ps,pe)){
		double radi1,radi2,drad2,ret;
		if(PTINSEGS(ins1,ps,ins2)){VRAD(ins1,radi1)VRAD(ins2,radi2)ret=OM(ins1,ins2)/2;}
		else{VRAD(ins2,radi1)VRAD(ins1,radi2)ret=OM(ins2,ins1)/2;}
		drad=radi1-rad1;MARC(drad)
		drad2=rad2-radi2;MARC(drad2)
		return ret+(drad+drad2)/2*r*r;
	}else if(PTINSEG(ps,ins1,ins2)&amp;#038;&amp;#038;PTINSEG(pe,ins1,ins2))return OM(ps,pe)/2;
	else{
		double*pins,*pout,radi;
		if(IM2(ps,ins1,ps,pe)&amp;lt;-EPS||IM2(pe,ins1,pe,ps)&amp;lt;-EPS){pins=ins2;pout=ins1;}
		else{pins=ins1;pout=ins2;}
		VRAD(pins,radi)
		if(IM2(pe,pout,pe,ps)&amp;lt;-EPS){
			drad=radi-rad1;MARC(drad)
			return OM(pins,pe)/2+drad/2*r*r;
		}else{
			drad=rad2-radi;MARC(drad)
			return OM(ps,pins)/2+drad/2*r*r;
		}
	}
}
&lt;/pre&gt;
&lt;p&gt;凸包:&lt;/p&gt;
&lt;pre&gt;
&lt;a href=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2011/02/cg_convex.png&quot;&gt;&lt;img src=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2011/02/cg_convex.png&quot; alt=&quot;&quot; title=&quot;cg_convex&quot; width=&quot;64&quot; height=&quot;64&quot; class=&quot;alignright size-full wp-image-32522&quot; /&gt;&lt;/a&gt;
&lt;font class=&quot;rem&quot;&gt;/*排序用*/&lt;/font&gt;
#define POINT struct TPoint
POINT{long xy[2];}pstart;
long operator&amp;lt;(POINT a,POINT b){
	long t=OM2(pstart.xy,a.xy,pstart.xy,b.xy);
	if(t==0){
		long d1,d2;
		DIS2(pstart.xy,a.xy,d1)
		DIS2(pstart.xy,b.xy,d2)
		return d1&amp;lt;d2;
	}else return t&gt;0;
}
&lt;font class=&quot;rem&quot;&gt;/*
O(nlogn)的凸包,返回值是凸多边形的顶点数,存在pts中,逆时针方向
使用:&lt;a href=&quot;#vector&quot;&gt;向量运算&lt;/a&gt;,&lt;a href=&quot;#distance&quot;&gt;距离&lt;/a&gt;,std::sort(algorithm)
*/&lt;/font&gt;
long convex(POINT*pts,long num,long*stack){
	long i,minp,minx=0x7fffffff,miny;
	for(i=0;i&amp;lt;num;i++){
		if(pts[i].xy[0]&amp;lt;minx){minx=pts[i].xy[0];miny=pts[i].xy[1];minp=i;}
		else if(pts[i].xy[0]==minx&amp;#038;&amp;#038;pts[i].xy[1]&amp;lt;miny)miny=pts[minp=i].xy[1];
	}
	if(minx==0x7fffffff)return 0;
	POINT _t=pts[minp];
	pts[minp]=pts[0];
	pts[0]=_t;
	pstart=pts[0];
	sort(pts+1,pts+num);
	long top=3;
	for(i=0;i&amp;lt;3;i++)stack[i+1]=i;
	for(i=3;i&amp;lt;num;i++){
		while(OM2(pts[stack[top-1]].xy,pts[stack[top]].xy,pts[stack[top-1]].xy,pts[i].xy)&amp;lt;0)top--;
		stack[++top]=i;
	}
	for(i=1;i&amp;lt;=top;i++)pts[i-1]=pts[stack[i]];
	return top;
}
&lt;/pre&gt;
&lt;p&gt;凸洞:&lt;a href=&quot;/wordpress/archives/27332&quot;&gt;见这里&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/507215660/AC_ben1222/feedsky/s.gif?r=http://www.ben1222.com/wordpress/archives/32483&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/AC_ben1222/507215660/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/AC_ben1222/507215660/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.ben1222.com/wordpress/archives/32483/feed</wfw:commentRss><slash:comments>6</slash:comments><description>本想在寒假期间写点什么的&amp;#8230;无奈域名出了点问题&amp;#8230;
导致这一个半月里面网站一直处于无法访问的状态&amp;#8230;
想起以前积累的计算几何模板&amp;#8230;想差不多可以整理下发出来&amp;#8230;
不过充斥着define&amp;#8230;以及define的奇怪用法&amp;#8230;可以说完全是C语言风格的代码&amp;#8230;
总之这是一个基于数组和define而不是类和template的模板&amp;#8230;会有人看吗&amp;#8230;
如果每段代码都注解出一步步怎么得到的话&amp;#8230;工程浩大&amp;#8230;
结果心血来潮&amp;#8230;给几乎每段代码画了个图片&amp;#8230;
蓝色是已知,红色是所求&amp;#8230;
画了几个才发现&amp;#8230;有些还真难用图片表达啊&amp;#8230;
那么就开始吧&amp;#8230;

font.rem{color:#0a0;}
先是关于点,线,圆的形式的说明

说明:
point,p,vector,v,点,向量:
  array[2]  [0]:x,dx  [1]:y,dy
line,vl,直线:
  array[3]  [0]:a  [1]:b  [2]:c
  对应直线方程ax+by+c=0
circle,o,圆:
  array[3]  [0]:x  [1]:y  [2]:r


常量:圆周率和微小值

#define PI 3.14159265358979
#define EPS 1e-10


然后是向量运算

#define IM(v1,v2) (v1[0]*v2[0]+v1[1]*v2[1])
#define IM2(ps1,pe1,ps2,pe2) ((pe1[0]-ps1[0])*(pe2[0]-ps2[0])+(pe1[1]-ps1[1])*(pe2[1]-ps2[1]))
/* 外积大于0,则v2在v1左手方向 */
#define OM(v1,v2) (v1[0]*v2[1]-v1[1]*v2[0])
#define OM2(ps1,pe1,ps2,pe2) ((pe1[0]-ps1[0])*(pe2[1]-ps2[1])-(pe1[1]-ps1[1])*(pe2[0]-ps2[0]))
#define SU(v1,v2,v3) v3[0]=v2[0]-v1[0];v3[1]=v2[1]-v1[1];


距离:

/*两点间距离平方*/
#define DIS2(p1,p2,ret) {double __v[2];SU(p1,p2,__v) ret=IM(__v,__v);}
/*两点间距离*/
double dis(long*p1,long*p2){
	double v[2];
	SU(p1,p2,v);
	return sqrt(IM(v,v));
}


关于圆:
三点求圆心:


/* 三点求圆心 */
#define SQS(n,d) n=(d)*(d)
#define ARCC(x1,y1,x2,y2,x3,y3,x0,y0) {\
	double SQS(__y1,y1),SQS(__y2,y2),SQS(__y3,y3),SQS(__x1,x1),SQS(__x2,x2),SQS(__x3,x3); [...]&lt;img src=&quot;http://www1.feedsky.com/t1/507215660/AC_ben1222/feedsky/s.gif?r=http://www.ben1222.com/wordpress/archives/32483&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/AC_ben1222/507215660/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/AC_ben1222/507215660/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description><category>code</category><category>模板</category><category>心血来潮</category><category>计算几何</category><category>图片</category><pubDate>Wed, 23 Feb 2011 15:25:48 +0800</pubDate><author>ben1222</author><comments>http://www.ben1222.com/wordpress/archives/32483#comments</comments><guid isPermaLink="false">http://www.ben1222.com/wordpress/?p=32483</guid><dc:creator>ben1222</dc:creator><fs:srclink>http://www.ben1222.com/wordpress/archives/32483</fs:srclink><fs:srcfeed>http://www.ben1222.com/wordpress/feed</fs:srcfeed><fs:itemid>feedsky/AC_ben1222/~8105908/507215660/5755039</fs:itemid></item><item><title>pe vol30 146~150</title><link>http://www.ben1222.com/wordpress/archives/32468</link><content:encoded>&lt;p&gt;最近好迷茫&amp;#8230;我想做什么?我能做什么?&lt;br /&gt;
没有排名&amp;#8230;没有考试&amp;#8230;没有比较&amp;#8230;不知道自己几斤几两&amp;#8230;该往什么方向努力&amp;#8230;&lt;br /&gt;
有能测出人各方面的长处短处的东西会怎么样呢?这样设想着&amp;#8230;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://projecteuler.net/index.php?section=problems&amp;amp;page=3&quot;&gt;Project Euler&lt;/a&gt;&lt;br /&gt;
pe第三页拖拖拉拉的终于切完了&lt;br /&gt;
(最近的新题貌似不太给力啊&amp;#8230;老题还是有不少有意思的题目&amp;#8230;)&lt;/p&gt;
&lt;p&gt;Problem 146 : C++,n^2+k连续素数,减少枚举量&lt;br /&gt;
Problem 147 : C++,数矩形,推出式子后就是简单的dp了&lt;br /&gt;
Problem 148 : C++,杨辉三角与分形,图形很美,画出图形后算起来就简单多了&lt;br /&gt;
Problem 149 : C++,矩阵中行、列、对角线方向的最大子段和&lt;br /&gt;
Problem 150 : C++,最大子三角形和,各行预处理下即可&lt;/p&gt;
&lt;p&gt;下面是详细内容:&lt;br /&gt;
&lt;span id=&quot;more-32468&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a name=&quot;pe_problem_146&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;pe_solution&quot;&gt;Problem 146&lt;br /&gt;
&lt;a style=&quot;text-decoration: none;&quot; title=&quot;Click to view problem&quot; href=&quot;http://projecteuler.net/index.php?section=problems&amp;amp;id=146&quot;&gt;Investigating a Prime Pattern &lt;/a&gt;&lt;br /&gt;
Project Euler 146&lt;br /&gt;
找n使其满足n^2+1,n^2+3,n^2+7,n^2+9,n^2+13,n^2+27是连续的质数&lt;br /&gt;
最小的正整数n是10&lt;br /&gt;
求n&amp;lt;150,000,000中满足上面条件的n的和&lt;/p&gt;
&lt;p&gt;首先,n肯定是偶数&lt;br /&gt;
而且不能有3,7,13 的因子&amp;#8230;&lt;br /&gt;
然后&amp;#8230;枚举判断试试看&lt;br /&gt;
速度好慢&amp;#8230;不过这样的数好稀少&amp;#8230;一百万中才3个&amp;#8230;&lt;br /&gt;
10&lt;br /&gt;
315410&lt;br /&gt;
927070&lt;/p&gt;
&lt;p&gt;貌似必须是10的倍数?&lt;br /&gt;
如果末尾是2的话,n^2+1的末尾就是5了,不是素数&lt;br /&gt;
如果末尾是4的话,n^2+9的末尾就是5了&lt;br /&gt;
末尾是6的话,n^2+9的末尾也是5&lt;br /&gt;
末尾是8的话,n^2+1的末尾也是5&lt;br /&gt;
所以n必须是10的倍数&lt;br /&gt;
因此n^2+5,n^2+15,n^2+25都一定是合数了,不用判断他们是否是合数&lt;br /&gt;
速度加快了近4倍&amp;#8230;&lt;/p&gt;
&lt;p&gt;n^2末尾2位是0了&amp;#8230;&lt;br /&gt;
根据3的倍数的各位和是3的倍数这一点可以知道&amp;#8230;n^2各位和必须是3k+1,否则加上末尾的1,3,7,9,13,27的各位和就会是3的倍数了&lt;br /&gt;
因此,n^2+11,n^2+17,n^2+23必定能被3整除,不用判断了&lt;/p&gt;
&lt;p&gt;跑了1.5小时才出来结果&amp;#8230;答案正确&lt;br /&gt;
貌似还可以用n对7的余数来进一步减少判断量
&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;&lt;a name=&quot;pe_problem_147&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;pe_solution&quot;&gt;Problem 147&lt;br /&gt;
&lt;a style=&quot;text-decoration: none;&quot; title=&quot;Click to view problem&quot; href=&quot;http://projecteuler.net/index.php?section=problems&amp;amp;id=147&quot;&gt;Rectangles in cross-hatched grids&lt;/a&gt;&lt;br /&gt;
a*b的网格,每个单位方格中有对角线&lt;br /&gt;
这样的网格中有多少个矩形呢?包括斜过来的&lt;br /&gt;
设这个函数是f(a,b)&lt;br /&gt;
求sum{f(a,b),a&amp;lt;=47,b&amp;lt;=43},(a,b是正整数)&lt;/p&gt;
&lt;p&gt;想DP&amp;#8230;可是不好办&amp;#8230;因为那个斜的&amp;#8230;&lt;br /&gt;
首先,f(a,b)=f(b,a)这是肯定的&lt;br /&gt;
那么可以想象a*b的网格由a*(b-1)的网格2个,中间重叠了a*(b-2)的部分&lt;br /&gt;
f(a,b)=f(a,b-1)*2-f(a,b-2)+g(a,b)&lt;br /&gt;
这里的g(a,b)是那些同时占据到2条a*1的那些矩形,这样的矩形数量好算些&amp;#8230;吧&lt;br /&gt;
增加的平放的矩形很简单,是a*(a+1)/2个&lt;br /&gt;
增加的斜放的矩形嘛&amp;#8230;设为h(a,b)个&lt;br /&gt;
由于每条只有1的宽度,所以应该也不难算&lt;br /&gt;
看看有哪些是有可能组成矩形的&lt;br /&gt;
&lt;a href=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2010/10/PE147_单条的可能性.png&quot;&gt;&lt;img src=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2010/10/PE147_单条的可能性.png&quot; alt=&quot;&quot; title=&quot;宽为1的情况下的各种可能&quot; width=&quot;338&quot; height=&quot;53&quot; class=&quot;alignnone size-full wp-image-32469&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
下侧的对称&lt;/p&gt;
&lt;p&gt;中间2种情况其实是对称的,算作一种&lt;br /&gt;
从左到右依次编号(1),(2),(2),(3)&lt;br /&gt;
那么看看上侧和下侧的组合的情况:h(a,b)=h_11(a,b)+h_12(a,b)+h_13(a,b)+h_21(a,b)+..+h_33(a,b)&lt;br /&gt;
&lt;a href=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2010/10/PE147_11.png&quot;&gt;&lt;img src=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2010/10/PE147_11.png&quot; alt=&quot;&quot; title=&quot;PE147_11&quot; width=&quot;621&quot; height=&quot;407&quot; class=&quot;alignnone size-full wp-image-32470&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
(1)-(1):&lt;/p&gt;
&lt;pre&gt;
    h_11(n,2)=n
    h_11(n,3)=(n-1)*2+(n-2)   (n&gt;=2)
    h_11(n,4)=(n-2)*2+(n-3)*2+(n-2)  (n&gt;=2)
    h_11(n,5)=(n-3)*2+(n-4)*2+(n-3)*2+(n-4)  (n&gt;=4)
    h_11(a,b)=
              {(a*2-(b*2-3))*(b-2)+(a-(b-2))  b is even
              {(a*2-(b*2-3))*(b-1)-(a-(b-1))  b is odd
             =(a*2-b*2+3)*(b-2)+(a-b+2)
&lt;/pre&gt;
&lt;p&gt;(1)-(2), (2)-(1):限制住必须是宽为sqrt(2)/2的矩形了&lt;/p&gt;
&lt;pre&gt;
    h_12(a,b)=h_21(a,b)=h_11_0(a-1,b)=((a-1)-(b-2))*2
        =(a-b+1)*2
&lt;/pre&gt;
&lt;p&gt;(1)-(3), (3)-(1):必须宽超过sqrt(2)/2的矩形,和上面(1)-(2),(2)-(1)那种合并起来看就比较方便&lt;/p&gt;
&lt;pre&gt;
    h_12(a,b)+h_13(a,b)=h_21(a,b)+h_31(a,b)
        =(a-(b-1))*2*(b-1)
        =(a-b+1)*2*(b-1)
&lt;/pre&gt;
&lt;p&gt;(2)-(3), (3)-(2):这个不存在满足的情况&lt;br /&gt;
(2)-(2), (3)-(3):这2个也合在一起看比较方便&lt;/p&gt;
&lt;pre&gt;
    h_22(a,b)+h_33(a,b)
    b=4:(a-b)*2+(a-b+1)*2+(a-b)*2+(a-b+1)
    b=5:(a-b)*2+(a-b+1)*2+(a-b)*2+(a-b+1)*2+(a-b)
    h_22(a,b)+h_33(a,b)=(a-b)*b+(a-b+1)*(b-1)
&lt;/pre&gt;
&lt;p&gt;连在一起就是:&lt;/p&gt;
&lt;pre&gt;
h(a,b)=h_11(a,b)+(h_12(a,b)+h_13(a,b))*2+(h_22(a,b)+h_33(a,b))
    =(a*2-b*2+3)*(b-2)+(a-b+2)+(a-b+1)*2*(b-1)*2+(a-b)*b+(a-b+1)*(b-1)
    =8*a*b-8*a-8*b^2+16*b-9
g(a,b)=a*(a+1)/2+8*a*b-8*a-8*b^2+16*b-9
&lt;/pre&gt;
&lt;p&gt;然后就是简单的dp了,答案正确
&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;&lt;a name=&quot;pe_problem_148&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;pe_solution&quot;&gt;Problem 148&lt;br /&gt;
&lt;a style=&quot;text-decoration: none;&quot; title=&quot;Click to view problem&quot; href=&quot;http://projecteuler.net/index.php?section=problems&amp;amp;id=148&quot;&gt;Exploring Pascal&amp;#8217;s triangle.&lt;/a&gt;&lt;br /&gt;
杨辉三角中前10^9行中不能被7整除的数有多少&lt;/p&gt;
&lt;p&gt;杨辉三角中所有数都用它除7的余数来表示的话,就是找不为0的项的个数&lt;br /&gt;
设A={&lt;br /&gt;
1&lt;br /&gt;
1 1&lt;br /&gt;
1 2 1&lt;br /&gt;
1 3 3 1&lt;br /&gt;
1 4 6 4 1&lt;br /&gt;
1 5 3 3 5 1&lt;br /&gt;
1 6 1 6 1 6 1&lt;br /&gt;
}&lt;br /&gt;
也就是模7的杨辉三角前7行,有28个非7倍数的数&lt;br /&gt;
那么前14行是&lt;br /&gt;
A&lt;br /&gt;
A A&lt;br /&gt;
中间空余部分倒三角形的区域全是0,也就是是7的倍数&lt;br /&gt;
前49行是&lt;br /&gt;
B={&lt;br /&gt;
A&lt;br /&gt;
A  A&lt;br /&gt;
A 2A  A&lt;br /&gt;
A 3A 3A  A&lt;br /&gt;
A 4A 6A 4A  A&lt;br /&gt;
A 5A 3A 3A 5A  A&lt;br /&gt;
A 6A 1A 6A 1A 6A  A&lt;br /&gt;
}&lt;br /&gt;
由于7是质数,所以n*A(n&amp;lt;7)不会出现7的倍数&lt;br /&gt;
来张图片好理解一些:很像&lt;a href=&quot;http://www.matrix67.com/blog/archives/280&quot;&gt;Sierpinski三角形&lt;/a&gt;吧&lt;br /&gt;
&lt;a href=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2010/10/PE148_7级三角形.png&quot;&gt;&lt;img src=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2010/10/PE148_7级三角形.png&quot; alt=&quot;&quot; title=&quot;PE148_7级三角形&quot; width=&quot;767&quot; height=&quot;645&quot; class=&quot;alignnone size-full wp-image-32471&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
其中灰色的部分是7的倍数&lt;/p&gt;
&lt;p&gt;算非7倍数的项很方便:&lt;br /&gt;
前7^2行有28^2个非7倍数的项&lt;br /&gt;
前7^3行有28^3个非7倍数的项&lt;br /&gt;
以此类推&lt;/p&gt;
&lt;p&gt;剩下的就简单了,O(logn)的复杂度搞定吧&lt;br /&gt;
瞬出,答案正确 &lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a name=&quot;pe_problem_149&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;pe_solution&quot;&gt;Problem 149&lt;br /&gt;
&lt;a style=&quot;text-decoration: none;&quot; title=&quot;Click to view problem&quot; href=&quot;http://projecteuler.net/index.php?section=problems&amp;amp;id=149&quot;&gt;Searching for a maximum-sum subsequence.&lt;/a&gt;&lt;br /&gt;
2000*2000的矩阵(有负数)中找出行、列、对角线方向的连续项之和的最大值&lt;/p&gt;
&lt;p&gt;对每整行、整列、整对角线分别做最大子段和&lt;br /&gt;
复杂度O(n^2)&lt;br /&gt;
不到一秒就出结果,答案正确
&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;&lt;a name=&quot;pe_problem_150&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;pe_solution&quot;&gt;Problem 150&lt;br /&gt;
&lt;a style=&quot;text-decoration: none;&quot; title=&quot;Click to view problem&quot; href=&quot;http://projecteuler.net/index.php?section=problems&amp;amp;id=150&quot;&gt;Searching a triangular array for a sub-triangle having minimum-sum.&lt;/a&gt;&lt;br /&gt;
堆成一千行三角形的数字,找一个子三角形,使得其包含的数字之和最小&lt;/p&gt;
&lt;p&gt;枚举子三角形的上顶点,然后往下扩展&lt;br /&gt;
每行都预处理下,以便快速得到该行的各区间和&lt;br /&gt;
O(n^3),隐藏的常系数较小&lt;br /&gt;
5秒搞定,答案正确
&lt;/p&gt;&lt;/div&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/507215661/AC_ben1222/feedsky/s.gif?r=http://www.ben1222.com/wordpress/archives/32468&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/AC_ben1222/507215661/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/AC_ben1222/507215661/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.ben1222.com/wordpress/archives/32468/feed</wfw:commentRss><slash:comments>3</slash:comments><description>最近好迷茫&amp;#8230;我想做什么?我能做什么?
没有排名&amp;#8230;没有考试&amp;#8230;没有比较&amp;#8230;不知道自己几斤几两&amp;#8230;该往什么方向努力&amp;#8230;
有能测出人各方面的长处短处的东西会怎么样呢?这样设想着&amp;#8230;
Project Euler
pe第三页拖拖拉拉的终于切完了
(最近的新题貌似不太给力啊&amp;#8230;老题还是有不少有意思的题目&amp;#8230;)
Problem 146 : C++,n^2+k连续素数,减少枚举量
Problem 147 : C++,数矩形,推出式子后就是简单的dp了
Problem 148 : C++,杨辉三角与分形,图形很美,画出图形后算起来就简单多了
Problem 149 : C++,矩阵中行、列、对角线方向的最大子段和
Problem 150 : C++,最大子三角形和,各行预处理下即可
下面是详细内容:


Problem 146
Investigating a Prime Pattern 
Project Euler 146
找n使其满足n^2+1,n^2+3,n^2+7,n^2+9,n^2+13,n^2+27是连续的质数
最小的正整数n是10
求n&amp;#60;150,000,000中满足上面条件的n的和
首先,n肯定是偶数
而且不能有3,7,13 的因子&amp;#8230;
然后&amp;#8230;枚举判断试试看
速度好慢&amp;#8230;不过这样的数好稀少&amp;#8230;一百万中才3个&amp;#8230;
10
315410
927070
貌似必须是10的倍数?
如果末尾是2的话,n^2+1的末尾就是5了,不是素数
如果末尾是4的话,n^2+9的末尾就是5了
末尾是6的话,n^2+9的末尾也是5
末尾是8的话,n^2+1的末尾也是5
所以n必须是10的倍数
因此n^2+5,n^2+15,n^2+25都一定是合数了,不用判断他们是否是合数
速度加快了近4倍&amp;#8230;
n^2末尾2位是0了&amp;#8230;
根据3的倍数的各位和是3的倍数这一点可以知道&amp;#8230;n^2各位和必须是3k+1,否则加上末尾的1,3,7,9,13,27的各位和就会是3的倍数了
因此,n^2+11,n^2+17,n^2+23必定能被3整除,不用判断了
跑了1.5小时才出来结果&amp;#8230;答案正确
貌似还可以用n对7的余数来进一步减少判断量


Problem 147
Rectangles in cross-hatched grids
a*b的网格,每个单位方格中有对角线
这样的网格中有多少个矩形呢?包括斜过来的
设这个函数是f(a,b)
求sum{f(a,b),a&amp;#60;=47,b&amp;#60;=43},(a,b是正整数)
想DP&amp;#8230;可是不好办&amp;#8230;因为那个斜的&amp;#8230;
首先,f(a,b)=f(b,a)这是肯定的
那么可以想象a*b的网格由a*(b-1)的网格2个,中间重叠了a*(b-2)的部分
f(a,b)=f(a,b-1)*2-f(a,b-2)+g(a,b)
这里的g(a,b)是那些同时占据到2条a*1的那些矩形,这样的矩形数量好算些&amp;#8230;吧
增加的平放的矩形很简单,是a*(a+1)/2个
增加的斜放的矩形嘛&amp;#8230;设为h(a,b)个
由于每条只有1的宽度,所以应该也不难算
看看有哪些是有可能组成矩形的

下侧的对称
中间2种情况其实是对称的,算作一种
从左到右依次编号(1),(2),(2),(3)
那么看看上侧和下侧的组合的情况:h(a,b)=h_11(a,b)+h_12(a,b)+h_13(a,b)+h_21(a,b)+..+h_33(a,b)

(1)-(1):

    h_11(n,2)=n
    h_11(n,3)=(n-1)*2+(n-2)   (n&gt;=2)
    h_11(n,4)=(n-2)*2+(n-3)*2+(n-2)  (n&gt;=2)
    h_11(n,5)=(n-3)*2+(n-4)*2+(n-3)*2+(n-4)  (n&gt;=4)
    [...]&lt;img src=&quot;http://www1.feedsky.com/t1/507215661/AC_ben1222/feedsky/s.gif?r=http://www.ben1222.com/wordpress/archives/32468&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/AC_ben1222/507215661/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/AC_ben1222/507215661/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description><category>素数</category><category>Project Euler</category><category>三角形</category><category>分形</category><category>枚举</category><category>数学</category><category>dp</category><pubDate>Fri, 29 Oct 2010 10:16:44 +0800</pubDate><author>ben1222</author><comments>http://www.ben1222.com/wordpress/archives/32468#comments</comments><guid isPermaLink="false">http://www.ben1222.com/wordpress/?p=32468</guid><dc:creator>ben1222</dc:creator><fs:srclink>http://www.ben1222.com/wordpress/archives/32468</fs:srclink><fs:srcfeed>http://www.ben1222.com/wordpress/feed</fs:srcfeed><fs:itemid>feedsky/AC_ben1222/~8105908/507215661/5755039</fs:itemid></item><item><title>flash Electric box 2</title><link>http://www.ben1222.com/wordpress/archives/32462</link><content:encoded>&lt;p&gt;&lt;a href=&quot;http://www.kongregate.com/games/TwinkleStarGames/electric-box-2&quot;&gt;Electric box 2&lt;/a&gt;&lt;br /&gt;
Electric box的第二作&amp;#8230;&lt;br /&gt;
目标是通过能量的各种形式的转换将能量传输到目标点&amp;#8230;&lt;br /&gt;
各种神一般的布局&amp;#8230;&lt;/p&gt;
&lt;p&gt;能量形式&amp;#8230;电,光,风,流水,蒸汽,激光,无线,电池,仓鼠(这个怎么也算&amp;#8230;)&lt;br /&gt;
电&amp;#8230;有电线的地方就能传输&amp;#8230;&lt;br /&gt;
光&amp;#8230;灯泡和太阳能电池板&amp;#8230;&lt;br /&gt;
风&amp;#8230;风扇和发电机&amp;#8230;&lt;br /&gt;
流水&amp;#8230;水壶中流不完的水和发电机&amp;#8230;&lt;br /&gt;
蒸汽&amp;#8230;水壶中沸腾不完的水和&amp;#8230;蒸汽机?&lt;br /&gt;
激光&amp;#8230;激光发射器和镜面反射和激光接收器&amp;#8230;&lt;br /&gt;
无线形式的电流&amp;#8230;一次连上了无论走多远都能继续传输&amp;#8230;&lt;br /&gt;
电池&amp;#8230;充电一次就可以一直放出电&amp;#8230;&lt;br /&gt;
仓鼠&amp;#8230;看到食物或听到音乐就会跑步发电&amp;#8230;&lt;/p&gt;
&lt;p&gt;还有各种稀奇古怪的东西&amp;#8230;像&lt;del style=&quot;display:none;&quot;&gt;天元突破&lt;/del&gt;钻头啦&amp;#8230;&lt;del style=&quot;display:none;&quot;&gt;白井黑子&lt;/del&gt;teleporter啦&amp;#8230;&lt;del style=&quot;display:none;&quot;&gt;哈利波特与&lt;/del&gt;魔法石啦&amp;#8230;&lt;/p&gt;
&lt;p&gt;最后一关花了半小时才解出&amp;#8230;&lt;br /&gt;
&lt;a href=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2010/10/Electric_box_2_Level40.png&quot;&gt;Electric box 2 Level 40&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/507215662/AC_ben1222/feedsky/s.gif?r=http://www.ben1222.com/wordpress/archives/32462&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/AC_ben1222/507215662/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/AC_ben1222/507215662/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.ben1222.com/wordpress/archives/32462/feed</wfw:commentRss><slash:comments>0</slash:comments><description>Electric box 2
Electric box的第二作&amp;#8230;
目标是通过能量的各种形式的转换将能量传输到目标点&amp;#8230;
各种神一般的布局&amp;#8230;
能量形式&amp;#8230;电,光,风,流水,蒸汽,激光,无线,电池,仓鼠(这个怎么也算&amp;#8230;)
电&amp;#8230;有电线的地方就能传输&amp;#8230;
光&amp;#8230;灯泡和太阳能电池板&amp;#8230;
风&amp;#8230;风扇和发电机&amp;#8230;
流水&amp;#8230;水壶中流不完的水和发电机&amp;#8230;
蒸汽&amp;#8230;水壶中沸腾不完的水和&amp;#8230;蒸汽机?
激光&amp;#8230;激光发射器和镜面反射和激光接收器&amp;#8230;
无线形式的电流&amp;#8230;一次连上了无论走多远都能继续传输&amp;#8230;
电池&amp;#8230;充电一次就可以一直放出电&amp;#8230;
仓鼠&amp;#8230;看到食物或听到音乐就会跑步发电&amp;#8230;
还有各种稀奇古怪的东西&amp;#8230;像天元突破钻头啦&amp;#8230;白井黑子teleporter啦&amp;#8230;哈利波特与魔法石啦&amp;#8230;
最后一关花了半小时才解出&amp;#8230;
Electric box 2 Level 40&lt;img src=&quot;http://www1.feedsky.com/t1/507215662/AC_ben1222/feedsky/s.gif?r=http://www.ben1222.com/wordpress/archives/32462&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/AC_ben1222/507215662/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/AC_ben1222/507215662/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description><category>Puzzle</category><category>flash</category><pubDate>Thu, 14 Oct 2010 14:16:28 +0800</pubDate><author>ben1222</author><comments>http://www.ben1222.com/wordpress/archives/32462#comments</comments><guid isPermaLink="false">http://www.ben1222.com/wordpress/?p=32462</guid><dc:creator>ben1222</dc:creator><fs:srclink>http://www.ben1222.com/wordpress/archives/32462</fs:srclink><fs:srcfeed>http://www.ben1222.com/wordpress/feed</fs:srcfeed><fs:itemid>feedsky/AC_ben1222/~8105908/507215662/5755039</fs:itemid></item><item><title>pe vol29 141~145</title><link>http://www.ben1222.com/wordpress/archives/32458</link><content:encoded>&lt;p&gt;Project Euler放完假后&amp;#8230;发现做了许多不得了的&lt;a href=&quot;http://projecteuler.net/index.php?section=news&amp;amp;show=archives#27&quot;&gt;更新&lt;/a&gt;&amp;#8230;&lt;br /&gt;
支持LaTeX这个不错&amp;#8230;而且神奇的是&amp;#8230;居然是以HTML形式而非图片形式显示的&amp;#8230;真的能做到啊&amp;#8230;这样也不会有缩放失真&amp;#8230;真好&amp;#8230;&lt;br /&gt;
然后增加了Veterans 这个等级&amp;#8230;条件是300+&amp;#8230;不过不会显示题数了&amp;#8230;也就是说&amp;#8230;没法知道是不是解决了100%的题目&amp;#8230;&lt;br /&gt;
而且这个等级中的排名是按注册时间来的&amp;#8230;&lt;br /&gt;
这个标准&amp;#8230;不会改动吗?否则&amp;#8230;比如总题数有600题的时候&amp;#8230;貌似扯远了&amp;#8230;&lt;br /&gt;
不过对防作弊而言是不错的&amp;#8230;&lt;br /&gt;
最后&amp;#8230;那个public profile页面居然不再是public的了&amp;#8230;虽然这是引入Veterans等级后的必然结果&amp;#8230;因为那里有写用户做了哪些题&amp;#8230;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://forum.projecteuler.net/viewtopic.php?f=5&amp;amp;t=2007&quot;&gt;帖子里&lt;/a&gt;讨论了很多关于这次改版的事&amp;#8230;&lt;br /&gt;
为什么题目提供了forum却还是很多人发到公开的博客上呢&amp;#8230;&lt;br /&gt;
语言障碍和与forum中雷同的思路&amp;#8230;很有力的观点&amp;#8230;&lt;br /&gt;
反驳是&amp;#8230;问了很多博客的主人&amp;#8230;得到的回答大多数却是:因为别人都这么做&amp;#8230;&lt;br /&gt;
&lt;!--我貌似也被问到...--&gt;&lt;br /&gt;
自问一下&amp;#8230;我是什么原因呢&amp;#8230;&lt;br /&gt;
最初可能是因为&amp;#8230;像在oj上做题似的&amp;#8230;然后做题会写解题报告&amp;#8230;然后&amp;#8230;&lt;br /&gt;
不过当时貌似是因为&lt;a href=&quot;http://www.wolframalpha.com/&quot;&gt;WolframAlpha&lt;/a&gt;才决定做PE的&amp;#8230;?&lt;br /&gt;
&lt;!--可能主要还是想炫耀?...--&gt;&lt;br /&gt;
扯远了&amp;#8230;&lt;br /&gt;
&lt;a href=&quot;http://projecteuler.net/index.php?section=problems&amp;amp;page=3&quot;&gt;Project Euler&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Problem 141 : C++,找使存在除数,商,余数,形成等比数列的完全平方数,枚举等比数列,判完全平方&lt;br /&gt;
Problem 142 : C++,找3个数两两求和求差都是完全平方数,枚举勾股数,注意考虑非本源勾股数&lt;br /&gt;
Problem 143 : C++,费马点到三边距离以及三边都是正整数的三角形,枚举内角120度的整数边三角形后配对&lt;br /&gt;
Problem 144 : C++,计算几何,椭圆形与直线交&lt;br /&gt;
Problem 145 : C++,数字反向相加后全由奇数位组成,暴力枚举&lt;/p&gt;
&lt;p&gt;下面是详细内容:&lt;br /&gt;
&lt;span id=&quot;more-32458&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a name=&quot;pe_problem_141&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;pe_solution&quot;&gt;Problem 141&lt;br /&gt;
&lt;a style=&quot;text-decoration: none;&quot; title=&quot;Click to view problem&quot; href=&quot;http://projecteuler.net/index.php?section=problems&amp;amp;id=141&quot;&gt;Investigating progressive numbers, n, which are also square.&lt;/a&gt;&lt;br /&gt;
正整数n除以d的商是q,余数是r,如果存在d,q,r能组成等比数列那么称n是递进的&lt;br /&gt;
求n小于10^12中所有递进的并且是完全平方数的总和&lt;/p&gt;
&lt;p&gt;n=d*q+r&lt;br /&gt;
由于r是余数,所以r肯定小于d&lt;br /&gt;
那么只有三种排列&lt;br /&gt;
r,d,q&lt;br /&gt;
r,q,d&lt;br /&gt;
q,r,d&lt;/p&gt;
&lt;p&gt;与其枚举n,还是试试枚举等比数列吧&amp;#8230;&lt;br /&gt;
公比一定是个有理数,设为R=u/v&lt;br /&gt;
a,b=a*R,c=a*R^2&lt;br /&gt;
a=v*v*k&lt;br /&gt;
b=v*u*k&lt;br /&gt;
c=u*u*k&lt;br /&gt;
枚举u,v,k来获得等比数列&amp;#8230;其中u和v必须是互质的&lt;/p&gt;
&lt;p&gt;另一个条件是n为完全平方数,看看三种排列带入后是什么样的式子&lt;br /&gt;
r,d,q: n=b*c+a=v*u*k*u*u*k+v*v*k=v*k*(u*u*u*k+v)&lt;br /&gt;
r,q,d: n=b*c+a=v*k*(u*u*u*k+v)&lt;br /&gt;
q,r,d: n=a*c+b=v*v*k*u*u*k+v*u*k=v*u*k*(v*u*k+1)&lt;br /&gt;
前两种排列得到的结果是一样的,而第三种排列的情况不可能是完全平方数(有形如x*(x+1)的完全平方数吗?)&lt;/p&gt;
&lt;p&gt;因此只要枚举u,v,k,然后判断 v*k*(u*u*u*k+v) 是否为完全平方数就行了&lt;br /&gt;
限制条件:u,v,k是正整数; u&amp;gt;v; gcd(u,v)=1; n&amp;lt;10^12&lt;br /&gt;
判平方的时候小心溢出&amp;#8230;&lt;br /&gt;
5秒搞定&amp;#8230;答案正确&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a name=&quot;pe_problem_142&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;pe_solution&quot;&gt;Problem 142&lt;br /&gt;
&lt;a style=&quot;text-decoration: none;&quot; title=&quot;Click to view problem&quot; href=&quot;http://projecteuler.net/index.php?section=problems&amp;amp;id=142&quot;&gt;Perfect Square Collection&lt;/a&gt;&lt;br /&gt;
题目超短&amp;#8230;&lt;br /&gt;
找最小的x+y+z使得存在整数x&amp;gt;y&amp;gt;z&amp;gt;0满足x+y,x-y,x+z,x-z,y+z,y-z都是完全平方数&lt;/p&gt;
&lt;p&gt;设x-y=a^2,y-z=b^2,x-z=c^2,那么&lt;br /&gt;
a^2+b^2=c^2&lt;br /&gt;
这不就是勾股数吗&amp;#8230;&lt;br /&gt;
x和y可以表示成&amp;#8230;&lt;br /&gt;
y=z+b^2&lt;br /&gt;
x=z+c^2&lt;br /&gt;
其他3个完全平方数表示成&amp;#8230;&lt;br /&gt;
x+y=z*2+2*b^2+a^2&lt;br /&gt;
x+z=z*2+a^2+b^2&lt;br /&gt;
y+z=z*2+b^2&lt;br /&gt;
那么枚举勾股数吧,对每组(a,b),枚举z,并检查x+y+z=z*3+2*b^2+a^2以得到最小值&lt;br /&gt;
&lt;strong&gt;这里写代码的时候犯了个错误&amp;#8230;忘记考虑非本源勾股数了&amp;#8230;&lt;/strong&gt;&lt;br /&gt;
结果导致得不到结果&amp;#8230;于是又在继续想&amp;#8230;&lt;/p&gt;
&lt;p&gt;设x+y=d^2,x+z=e^2,y+z=f^2&lt;br /&gt;
d^2=c^2+f^2&lt;br /&gt;
d^2=b^2+e^2&lt;br /&gt;
也就是说&lt;br /&gt;
c^2=a^2+b^2&lt;br /&gt;
e^2=a^2+f^2&lt;br /&gt;
d^2=a^2+b^2+f^2&lt;br /&gt;
找两组勾股数(a,b,c),(a,f,e)使得 d^2=a^2+b^2+f^2&lt;br /&gt;
限制条件:f&amp;gt;b,e&amp;gt;c&lt;br /&gt;
x=(a^2+b^2+e^2)/2&lt;br /&gt;
y=(e^2+b^2-a^2)/2&lt;br /&gt;
z=(e^2-b^2-a^2)/2&lt;/p&gt;
&lt;p&gt;然后才发现自己一开始没考虑非本源勾股数&amp;#8230;&lt;br /&gt;
改正后发现其实答案挺小的&amp;#8230;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a name=&quot;pe_problem_143&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;pe_solution&quot;&gt;Problem 143&lt;br /&gt;
&lt;a style=&quot;text-decoration: none;&quot; title=&quot;Click to view problem&quot; href=&quot;http://projecteuler.net/index.php?section=problems&amp;amp;id=143&quot;&gt;Investigating the Torricelli point of a triangle &lt;/a&gt;&lt;br /&gt;
三角形费马点:到三顶点距离和最小的点&lt;br /&gt;
若三角形三边和费马点到三顶点距离分别都是整数,那么称这个三角形是Torricelli三角形&lt;br /&gt;
求费马点到三顶点距离和小于等于120000的数的和&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一开始题目看错了&amp;#8230;&lt;/strong&gt;以为费马点到三顶点的距离和需要是整数,但是三个距离不一定要整数&amp;#8230;结果下面就开始另一条路上的探索了&amp;#8230;&lt;br /&gt;
能用三角形三边长来计算费马点到三顶点的距离和吗?&lt;br /&gt;
余弦公式&amp;#8230;&lt;br /&gt;
b*b=p*p+q*q-2*p*q*cos120&lt;br /&gt;
三边的平方用p,q,r表示&amp;#8230;&lt;br /&gt;
a*a=q*q+r*r+q*r&lt;br /&gt;
b*b=p*p+q*q+p*q&lt;br /&gt;
c*c=p*p+r*r+p*r&lt;br /&gt;
用面积表示上面等式右边的几项&amp;#8230;&lt;br /&gt;
q*r*sin120/2=q*r*sqrt(3)/4=S_TBC&lt;br /&gt;
q*r=S_TBC*4/sqrt(3)&lt;br /&gt;
p*r=S_TAB*4/sqrt(3)&lt;br /&gt;
p*q=S_TAC*4/sqrt(3)&lt;br /&gt;
q*r+p*r+p*q=S_ABC*4/sqrt(3)&lt;br /&gt;
等式加起来&amp;#8230;&lt;br /&gt;
a*a+b*b+c*c=2*(q^2+p^2+r^2)+(qr+pq+pr)&lt;br /&gt;
(p+q+r)^2=p^2+q^2+r^2+2*(pq+pr+qr)&lt;br /&gt;
=(a*a+b*b+c*c+sqrt(3)*4*S_ABC)/2&lt;br /&gt;
面积用海伦公式就行了&lt;br /&gt;
=(a*a+b*b+c*c+sqrt(3*(a+b+c)(b+c-a)(a+c-b)(a+b-c)))/2&lt;br /&gt;
于是要求的&amp;#8221;费马点到三顶点的距离和&amp;#8221;就是&amp;#8230;&lt;br /&gt;
p+q+r=sqrt((a*a+b*b+c*c+sqrt(3*(a+b+c)(b+c-a)(a+c-b)(a+b-c)))/2)&lt;br /&gt;
根号套根号啊&amp;#8230;真恶心&amp;#8230;&lt;br /&gt;
暴力了一些小数据出来&amp;#8230;&lt;br /&gt;
a,b,c,p+q+r&lt;br /&gt;
43,147,152,185&lt;br /&gt;
49,285,296,331&lt;br /&gt;
57,65,73,112&lt;br /&gt;
73,88,95,147&lt;br /&gt;
95,312,343,403&lt;br /&gt;
97,185,208,273&lt;br /&gt;
111,221,280,331&lt;br /&gt;
127,168,205,283&lt;br /&gt;
147,377,437,520&lt;br /&gt;
152,343,387,485&lt;br /&gt;
193,2667,2728,2855&lt;br /&gt;
195,1544,1591,1729&lt;br /&gt;
211,1541,1560,1729&lt;/p&gt;
&lt;p&gt;找到了&lt;a href=&quot;http://www.research.att.com/~njas/sequences/A061281&quot;&gt;这么个数列&lt;/a&gt;&amp;#8230;对应上面每行第四项&amp;#8230;&lt;/p&gt;
&lt;p&gt;说起来三角形放大整数倍也自然是满足的&lt;br /&gt;
所以加个gcd(a,b,c)=1的条件&lt;br /&gt;
sqrt(3*(a+b+c)(b+c-a)(a+c-b)(a+b-c))&lt;br /&gt;
从这里找找突破口&amp;#8230;因为里面那几项必须有3的因子才可能开根号出来&lt;br /&gt;
首先,如果abc都是3的倍数,那么会因为gcd(a,b,c)!=1而不会被算到&lt;br /&gt;
枚举了对3取余后的余数情况&amp;#8230;得到的结论是&amp;#8230;abc中不能有2个数都是3的倍数&amp;#8230;&lt;br /&gt;
很&amp;#8230;微妙&amp;#8230;剪不掉多少多余的数据&amp;#8230;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;n天后&amp;#8230;重读题目&amp;#8230;&lt;/strong&gt;&lt;br /&gt;
才发现原来p,q,r也要是正整数&amp;#8230;&lt;br /&gt;
那么好办多了&amp;#8230;&lt;br /&gt;
三角形TAC,TAB,TBC都是整数边三角形,还是一个角120度的&amp;#8230;&lt;br /&gt;
那么跟&lt;a href=&quot;/wordpress/archives/32350&quot;&gt;Problem 279&lt;/a&gt;类似的方法生成120度角整数边三角形&lt;br /&gt;
然后按最短边排序&lt;br /&gt;
枚举看能不能把它们拼成一个三角形&lt;/p&gt;
&lt;p&gt;不到1秒就出结果了,答案正确&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a name=&quot;pe_problem_144&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;pe_solution&quot;&gt;Problem 144&lt;br /&gt;
&lt;a style=&quot;text-decoration: none;&quot; title=&quot;Click to view problem&quot; href=&quot;http://projecteuler.net/index.php?section=problems&amp;amp;id=144&quot;&gt;Investigating multiple reflections of a laser beam. &lt;/a&gt;&lt;br /&gt;
椭圆形白体(white cell?我把它当作黑体的反义词可以吗?)&lt;br /&gt;
椭圆形的方程是4*x^2+y^2=100&lt;br /&gt;
开口在顶端-0.01&amp;lt;x &amp;lt;0.01的位置&lt;br /&gt;
一束光沿某条直线射进去,问反射多少次可以从那个洞口出来&lt;/p&gt;
&lt;p&gt;计算几何吗&amp;#8230;&lt;br /&gt;
先看看切线的方程吧&amp;#8230;&lt;br /&gt;
4*x^2+y^2=100&lt;br /&gt;
对x求导,找斜率&lt;br /&gt;
8x+2*y*dy/dx=0&lt;br /&gt;
dy/dx=-4x/y&lt;br /&gt;
在(x0,y0)处的切线方程是&amp;#8230;&lt;br /&gt;
4*x0*x+y0*y=100&lt;br /&gt;
那么椭圆与直线的交点怎么算呢&amp;#8230;&lt;br /&gt;
ax+by+c=0&lt;br /&gt;
(x/d)^2+(y/e)^2=1&lt;br /&gt;
椭圆的参数方程是&amp;#8230;&lt;br /&gt;
x=d*cos(t)&lt;br /&gt;
y=e*sin(t)&lt;br /&gt;
代回去就是&amp;#8230;&lt;br /&gt;
a*d*cos(t)+b*e*sin(t)+c=0&lt;br /&gt;
变形&amp;#8230;&lt;br /&gt;
b*e*sin(t)=-c-a*d*cos(t)&lt;br /&gt;
两边平方&amp;#8230;&lt;br /&gt;
(b*e)^2*(1-cos^2(t))=c^2+2*c*a*d*cos(t)+(a*d)^2*cos^2(t)&lt;br /&gt;
设u=cos(t),代入上式&amp;#8230;解出u&lt;br /&gt;
(b*e)^2-(b*e*u)^2=c^2+2*c*a*d*u+(a*d*u)^2&lt;br /&gt;
u^2*((a*d)^2+(b*e)^2)+2*c*a*d*u+c^2-(b*e)^2=0&lt;br /&gt;
u=(-2*c*a*d±sqrt(4*(c*a*d)^2-4*((a*d)^2+(b*e)^2)*(c^2-(b*e)^2)))/(2*((a*d)^2+(b*e)^2))&lt;br /&gt;
=(-c*a*d±sqrt((c*a*d)^2-((a*d)^2+(b*e)^2)*(c^2-(b*e)^2)))/((a*d)^2+(b*e)^2)&lt;br /&gt;
设ad=a*d,be=b*e&lt;br /&gt;
=(-c*ad±sqrt((c*ad)^2-(ad^2+be^2)*(c^2-be^2)))/(ad^2+be^2)&lt;br /&gt;
=(-c*ad±sqrt((ad*be)^2+be^4-(c*be)^2))/(ad^2+be^2)&lt;br /&gt;
=(-c*ad±be*sqrt(ad^2+be^2-c^2))/(ad^2+be^2)&lt;br /&gt;
吐&amp;#8230;在电脑上用文本来推导真是让人想吐&amp;#8230;&lt;br /&gt;
估计也不会有人看吧&amp;#8230;也懒得弄成图片了&amp;#8230;&lt;br /&gt;
得到交点后就好办了,按切线方向反射,算下一个交点&lt;/p&gt;
&lt;pre&gt;#define EPS 1e-8
#define IM(v1,v2) (v1[0]*v2[0]+v1[1]*v2[1])
/*两点转换为解析式,ret[0]=a,ret[1]=b,ret[2]=c,ax+by+c=0*/
#define PT_LINE(p1,p2,ret) {ret[1]=p2[0]-p1[0];ret[0]=p1[1]-p2[1];ret[2]=-IM(p1,ret);}
/*
直线与椭圆的交点,返回值为交点个数
ax+by+c=0
(x/d)^2+(y/e)^2=1
x=( -c*ad*d土be*d*sqrt(ad^2+be^2-c^2) )/( ad^2+be^2 )
y=( -c*be*e干ad*e*sqrt(ad^2+be^2-c^2) )/( ad^2+be^2 )
*/
long leins(double d,double e,double*pl1,double*pl2,double*ret1,double*ret2){
 double vl[3];
 PT_LINE(pl1,pl2,vl)
 double ab=vl[0]*vl[0]*d*d+vl[1]*vl[1]*e*e,delta=ab-vl[2]*vl[2];
 if(delta&amp;lt;=-EPS)return 0;
 else if(delta&amp;lt;EPS){
 ret1[0]=-vl[2]*vl[0]*d*d/ab;
 ret1[1]=-vl[2]*vl[1]*e*e/ab;
 return 1;
 }else{
 double sq=sqrt(delta);
 ret1[0]=(-vl[2]*vl[0]*d*d+vl[1]*e*d*sq)/ab;
 ret1[1]=(-vl[2]*vl[1]*e*e-vl[0]*e*d*sq)/ab;
 ret2[0]=(-vl[2]*vl[0]*d*d-vl[1]*e*d*sq)/ab;
 ret2[1]=(-vl[2]*vl[1]*e*e+vl[0]*e*d*sq)/ab;
 return 2;
 }
}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a name=&quot;pe_problem_145&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;pe_solution&quot;&gt;Problem 145&lt;br /&gt;
&lt;a style=&quot;text-decoration: none;&quot; title=&quot;Click to view problem&quot; href=&quot;http://projecteuler.net/index.php?section=problems&amp;amp;id=145&quot;&gt;How many reversible numbers are there below one-billion?&lt;/a&gt;&lt;br /&gt;
对正整数n,如果[n+reverse(n)]的每一位都是由奇数组成的,那么称n是reversible&lt;br /&gt;
问10^9以内有多少个这样的n&lt;br /&gt;
其中n和reverse(n)都不能有前置0&lt;/p&gt;
&lt;p&gt;枚举而已吗&amp;#8230;那么多人过&amp;#8230;&lt;br /&gt;
暴力只要90秒&amp;#8230;&lt;br /&gt;
更好点的方法是按位数来算
&lt;/p&gt;&lt;/div&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/507215663/AC_ben1222/feedsky/s.gif?r=http://www.ben1222.com/wordpress/archives/32458&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/AC_ben1222/507215663/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/AC_ben1222/507215663/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.ben1222.com/wordpress/archives/32458/feed</wfw:commentRss><slash:comments>0</slash:comments><description>Project Euler放完假后&amp;#8230;发现做了许多不得了的更新&amp;#8230;
支持LaTeX这个不错&amp;#8230;而且神奇的是&amp;#8230;居然是以HTML形式而非图片形式显示的&amp;#8230;真的能做到啊&amp;#8230;这样也不会有缩放失真&amp;#8230;真好&amp;#8230;
然后增加了Veterans 这个等级&amp;#8230;条件是300+&amp;#8230;不过不会显示题数了&amp;#8230;也就是说&amp;#8230;没法知道是不是解决了100%的题目&amp;#8230;
而且这个等级中的排名是按注册时间来的&amp;#8230;
这个标准&amp;#8230;不会改动吗?否则&amp;#8230;比如总题数有600题的时候&amp;#8230;貌似扯远了&amp;#8230;
不过对防作弊而言是不错的&amp;#8230;
最后&amp;#8230;那个public profile页面居然不再是public的了&amp;#8230;虽然这是引入Veterans等级后的必然结果&amp;#8230;因为那里有写用户做了哪些题&amp;#8230;
帖子里讨论了很多关于这次改版的事&amp;#8230;
为什么题目提供了forum却还是很多人发到公开的博客上呢&amp;#8230;
语言障碍和与forum中雷同的思路&amp;#8230;很有力的观点&amp;#8230;
反驳是&amp;#8230;问了很多博客的主人&amp;#8230;得到的回答大多数却是:因为别人都这么做&amp;#8230;

自问一下&amp;#8230;我是什么原因呢&amp;#8230;
最初可能是因为&amp;#8230;像在oj上做题似的&amp;#8230;然后做题会写解题报告&amp;#8230;然后&amp;#8230;
不过当时貌似是因为WolframAlpha才决定做PE的&amp;#8230;?

扯远了&amp;#8230;
Project Euler
Problem 141 : C++,找使存在除数,商,余数,形成等比数列的完全平方数,枚举等比数列,判完全平方
Problem 142 : C++,找3个数两两求和求差都是完全平方数,枚举勾股数,注意考虑非本源勾股数
Problem 143 : C++,费马点到三边距离以及三边都是正整数的三角形,枚举内角120度的整数边三角形后配对
Problem 144 : C++,计算几何,椭圆形与直线交
Problem 145 : C++,数字反向相加后全由奇数位组成,暴力枚举
下面是详细内容:


Problem 141
Investigating progressive numbers, n, which are also square.
正整数n除以d的商是q,余数是r,如果存在d,q,r能组成等比数列那么称n是递进的
求n小于10^12中所有递进的并且是完全平方数的总和
n=d*q+r
由于r是余数,所以r肯定小于d
那么只有三种排列
r,d,q
r,q,d
q,r,d
与其枚举n,还是试试枚举等比数列吧&amp;#8230;
公比一定是个有理数,设为R=u/v
a,b=a*R,c=a*R^2
a=v*v*k
b=v*u*k
c=u*u*k
枚举u,v,k来获得等比数列&amp;#8230;其中u和v必须是互质的
另一个条件是n为完全平方数,看看三种排列带入后是什么样的式子
r,d,q: n=b*c+a=v*u*k*u*u*k+v*v*k=v*k*(u*u*u*k+v)
r,q,d: n=b*c+a=v*k*(u*u*u*k+v)
q,r,d: n=a*c+b=v*v*k*u*u*k+v*u*k=v*u*k*(v*u*k+1)
前两种排列得到的结果是一样的,而第三种排列的情况不可能是完全平方数(有形如x*(x+1)的完全平方数吗?)
因此只要枚举u,v,k,然后判断 v*k*(u*u*u*k+v) 是否为完全平方数就行了
限制条件:u,v,k是正整数; u&amp;#62;v; gcd(u,v)=1; n&amp;#60;10^12
判平方的时候小心溢出&amp;#8230;
5秒搞定&amp;#8230;答案正确


Problem 142
Perfect Square Collection
题目超短&amp;#8230;
找最小的x+y+z使得存在整数x&amp;#62;y&amp;#62;z&amp;#62;0满足x+y,x-y,x+z,x-z,y+z,y-z都是完全平方数
设x-y=a^2,y-z=b^2,x-z=c^2,那么
a^2+b^2=c^2
这不就是勾股数吗&amp;#8230;
x和y可以表示成&amp;#8230;
y=z+b^2
x=z+c^2
其他3个完全平方数表示成&amp;#8230;
x+y=z*2+2*b^2+a^2
x+z=z*2+a^2+b^2
y+z=z*2+b^2
那么枚举勾股数吧,对每组(a,b),枚举z,并检查x+y+z=z*3+2*b^2+a^2以得到最小值
这里写代码的时候犯了个错误&amp;#8230;忘记考虑非本源勾股数了&amp;#8230;
结果导致得不到结果&amp;#8230;于是又在继续想&amp;#8230;
设x+y=d^2,x+z=e^2,y+z=f^2
d^2=c^2+f^2
d^2=b^2+e^2
也就是说
c^2=a^2+b^2
e^2=a^2+f^2
d^2=a^2+b^2+f^2
找两组勾股数(a,b,c),(a,f,e)使得 d^2=a^2+b^2+f^2
限制条件:f&amp;#62;b,e&amp;#62;c
x=(a^2+b^2+e^2)/2
y=(e^2+b^2-a^2)/2
z=(e^2-b^2-a^2)/2
然后才发现自己一开始没考虑非本源勾股数&amp;#8230;
改正后发现其实答案挺小的&amp;#8230;


Problem 143
Investigating the Torricelli point of a triangle 
三角形费马点:到三顶点距离和最小的点
若三角形三边和费马点到三顶点距离分别都是整数,那么称这个三角形是Torricelli三角形
求费马点到三顶点距离和小于等于120000的数的和
一开始题目看错了&amp;#8230;以为费马点到三顶点的距离和需要是整数,但是三个距离不一定要整数&amp;#8230;结果下面就开始另一条路上的探索了&amp;#8230;
能用三角形三边长来计算费马点到三顶点的距离和吗?
余弦公式&amp;#8230;
b*b=p*p+q*q-2*p*q*cos120
三边的平方用p,q,r表示&amp;#8230;
a*a=q*q+r*r+q*r
b*b=p*p+q*q+p*q
c*c=p*p+r*r+p*r
用面积表示上面等式右边的几项&amp;#8230;
q*r*sin120/2=q*r*sqrt(3)/4=S_TBC
q*r=S_TBC*4/sqrt(3)
p*r=S_TAB*4/sqrt(3)
p*q=S_TAC*4/sqrt(3)
q*r+p*r+p*q=S_ABC*4/sqrt(3)
等式加起来&amp;#8230;
a*a+b*b+c*c=2*(q^2+p^2+r^2)+(qr+pq+pr)
(p+q+r)^2=p^2+q^2+r^2+2*(pq+pr+qr)
=(a*a+b*b+c*c+sqrt(3)*4*S_ABC)/2
面积用海伦公式就行了
=(a*a+b*b+c*c+sqrt(3*(a+b+c)(b+c-a)(a+c-b)(a+b-c)))/2
于是要求的&amp;#8221;费马点到三顶点的距离和&amp;#8221;就是&amp;#8230;
p+q+r=sqrt((a*a+b*b+c*c+sqrt(3*(a+b+c)(b+c-a)(a+c-b)(a+b-c)))/2)
根号套根号啊&amp;#8230;真恶心&amp;#8230;
暴力了一些小数据出来&amp;#8230;
a,b,c,p+q+r
43,147,152,185
49,285,296,331
57,65,73,112
73,88,95,147
95,312,343,403
97,185,208,273
111,221,280,331
127,168,205,283
147,377,437,520
152,343,387,485
193,2667,2728,2855
195,1544,1591,1729
211,1541,1560,1729
找到了这么个数列&amp;#8230;对应上面每行第四项&amp;#8230;
说起来三角形放大整数倍也自然是满足的
所以加个gcd(a,b,c)=1的条件
sqrt(3*(a+b+c)(b+c-a)(a+c-b)(a+b-c))
从这里找找突破口&amp;#8230;因为里面那几项必须有3的因子才可能开根号出来
首先,如果abc都是3的倍数,那么会因为gcd(a,b,c)!=1而不会被算到
枚举了对3取余后的余数情况&amp;#8230;得到的结论是&amp;#8230;abc中不能有2个数都是3的倍数&amp;#8230;
很&amp;#8230;微妙&amp;#8230;剪不掉多少多余的数据&amp;#8230;
n天后&amp;#8230;重读题目&amp;#8230;
才发现原来p,q,r也要是正整数&amp;#8230;
那么好办多了&amp;#8230;
三角形TAC,TAB,TBC都是整数边三角形,还是一个角120度的&amp;#8230;
那么跟Problem 279类似的方法生成120度角整数边三角形
然后按最短边排序
枚举看能不能把它们拼成一个三角形
不到1秒就出结果了,答案正确


Problem 144
Investigating multiple reflections of a laser [...]&lt;img src=&quot;http://www1.feedsky.com/t1/507215663/AC_ben1222/feedsky/s.gif?r=http://www.ben1222.com/wordpress/archives/32458&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/AC_ben1222/507215663/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/AC_ben1222/507215663/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description><category>模板</category><category>Project Euler</category><category>三角形</category><category>勾股数</category><category>计算几何</category><category>枚举</category><category>数学</category><pubDate>Tue, 05 Oct 2010 22:56:59 +0800</pubDate><author>ben1222</author><comments>http://www.ben1222.com/wordpress/archives/32458#comments</comments><guid isPermaLink="false">http://www.ben1222.com/wordpress/?p=32458</guid><dc:creator>ben1222</dc:creator><fs:srclink>http://www.ben1222.com/wordpress/archives/32458</fs:srclink><fs:srcfeed>http://www.ben1222.com/wordpress/feed</fs:srcfeed><fs:itemid>feedsky/AC_ben1222/~8105908/507215663/5755039</fs:itemid></item><item><title>FFT 快速傅立叶变换(任意点)</title><link>http://www.ben1222.com/wordpress/archives/32449</link><content:encoded>&lt;p&gt;这个月几乎都在搞保研的事情&amp;#8230;结果没拿到资格&amp;#8230;算了&amp;#8230;也算经历过了&amp;#8230;&lt;/p&gt;
&lt;p&gt;心血来潮想搞搞FFT玩玩&amp;#8230;&lt;br /&gt;
虽然在数字信号处理课上有比较详细的讲过&amp;#8230;不过是基2的,对于不是2^N点的FFT只能补零吗&amp;#8230;&lt;br /&gt;
本来是想做做图像的FFT看看&amp;#8230;但是图像的边不是2^N点的&amp;#8230;而且补零可能也不方便&amp;#8230;做滤波估计还会被补的0影响&amp;#8230;&lt;/p&gt;
&lt;p&gt;不管怎么样&amp;#8230;还是先看看基2的FFT怎么做吧&amp;#8230;&lt;br /&gt;
稍微看了下&lt;a href=&quot;http://en.wikipedia.org/wiki/Fft&quot;&gt;Wiki&lt;/a&gt;上的&amp;#8230;貌似还有不少别的方法的FFT&amp;#8230;&lt;br /&gt;
还是先看看经典的&lt;a href=&quot;http://en.wikipedia.org/wiki/Cooley%E2%80%93Tukey_FFT_algorithm&quot;&gt;Cooley Tukey&lt;/a&gt;算法吧&amp;#8230;&lt;br /&gt;
离散傅立叶变换的定义式大约是这个样子的&lt;br /&gt;
&lt;a href=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2010/09/fft_def.png&quot;&gt;&lt;img src=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2010/09/fft_def.png&quot; alt=&quot;&quot; title=&quot;fft_def&quot; width=&quot;308&quot; height=&quot;77&quot; class=&quot;alignnone size-full wp-image-32450&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
这里用W方便表示,W(a,n)表示极角是a/n个360度的角度,这里关于角度的性质W也有&lt;/p&gt;
&lt;p&gt;作为例子,展开个n=8的情况&lt;br /&gt;
&lt;a href=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2010/09/fft_exp8.png&quot;&gt;&lt;img src=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2010/09/fft_exp8.png&quot; alt=&quot;&quot; title=&quot;fft_exp8&quot; width=&quot;611&quot; height=&quot;215&quot; class=&quot;alignnone size-full wp-image-32451&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
为了计算右边那一列n个数,直接算要n^2级别的计算量&lt;br /&gt;
现在将黄色和绿色的部分分别取出来&lt;br /&gt;
&lt;a href=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2010/09/fft_split8.png&quot;&gt;&lt;img src=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2010/09/fft_split8.png&quot; alt=&quot;&quot; title=&quot;fft_split8&quot; width=&quot;806&quot; height=&quot;234&quot; class=&quot;alignnone size-full wp-image-32452&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
X_e和X_o分别是原数列的偶数项和奇数项的离散傅立叶变换,递归的子结构出现了&lt;br /&gt;
放到原式中就变成了&lt;br /&gt;
&lt;a href=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2010/09/fft_result8.png&quot;&gt;&lt;img src=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2010/09/fft_result8.png&quot; alt=&quot;&quot; title=&quot;fft_result8&quot; width=&quot;177&quot; height=&quot;202&quot; class=&quot;alignnone size-full wp-image-32453&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
这样,只要分别计算出X_e和X_o并附加2*n级别的计算量,就能完成原本要n^2级别的计算量才能完成的运算了&lt;br /&gt;
不过毕竟是最基础的方法&amp;#8230;代码的运行效率还有很多优化的余地&lt;/p&gt;
&lt;p&gt;虽然说是基2的,但是实际上只是个特例&lt;br /&gt;
实质上这个方法并不是对分成2份才有效&lt;br /&gt;
比如以n=6作为例子,既可以分成2份:&lt;br /&gt;
&lt;a href=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2010/09/fft_6radix2.png&quot;&gt;&lt;img src=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2010/09/fft_6radix2.png&quot; alt=&quot;&quot; title=&quot;fft_6radix2&quot; width=&quot;604&quot; height=&quot;162&quot; class=&quot;alignnone size-full wp-image-32454&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
也可以分成3份:&lt;br /&gt;
&lt;a href=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2010/09/fft_6radix3.png&quot;&gt;&lt;img src=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2010/09/fft_6radix3.png&quot; alt=&quot;&quot; title=&quot;fft_6radix3&quot; width=&quot;687&quot; height=&quot;158&quot; class=&quot;alignnone size-full wp-image-32455&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
而且依然满足递归的子结构的要求&lt;br /&gt;
也就是,n=a*b的情况下,可以分成a份,计算a个长度为b的子序列的离散傅立叶变换值,附加a*n的级别的运算量,就可以完成n点的离散傅立叶变换了&lt;br /&gt;
这样,对任意的n都可以做快速傅立叶变换了:分解质因数&lt;br /&gt;
可惜n是质数的时候,貌似只能用定义式了&amp;#8230;&lt;/p&gt;
&lt;p&gt;基2,4,8的情况下,在代码级别上还可以有很好的优化&lt;br /&gt;
因为这时会让中间很多步骤中有关W的复数运算简化很多,不用复数乘法,而用实部虚部做较少的加减法来完成&lt;/p&gt;
&lt;p&gt;浮点数真是功不可没啊&amp;#8230;用很小的精度代价让一个浮点数包含了原序列每个数的一部分信息&amp;#8230;就像全息照相一样呢&amp;#8230;&lt;br /&gt;
&lt;!--脑中突然闪现...一为全,全为一...--&gt;&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/507215664/AC_ben1222/feedsky/s.gif?r=http://www.ben1222.com/wordpress/archives/32449&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/AC_ben1222/507215664/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/AC_ben1222/507215664/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.ben1222.com/wordpress/archives/32449/feed</wfw:commentRss><slash:comments>0</slash:comments><description>这个月几乎都在搞保研的事情&amp;#8230;结果没拿到资格&amp;#8230;算了&amp;#8230;也算经历过了&amp;#8230;
心血来潮想搞搞FFT玩玩&amp;#8230;
虽然在数字信号处理课上有比较详细的讲过&amp;#8230;不过是基2的,对于不是2^N点的FFT只能补零吗&amp;#8230;
本来是想做做图像的FFT看看&amp;#8230;但是图像的边不是2^N点的&amp;#8230;而且补零可能也不方便&amp;#8230;做滤波估计还会被补的0影响&amp;#8230;
不管怎么样&amp;#8230;还是先看看基2的FFT怎么做吧&amp;#8230;
稍微看了下Wiki上的&amp;#8230;貌似还有不少别的方法的FFT&amp;#8230;
还是先看看经典的Cooley Tukey算法吧&amp;#8230;
离散傅立叶变换的定义式大约是这个样子的

这里用W方便表示,W(a,n)表示极角是a/n个360度的角度,这里关于角度的性质W也有
作为例子,展开个n=8的情况

为了计算右边那一列n个数,直接算要n^2级别的计算量
现在将黄色和绿色的部分分别取出来

X_e和X_o分别是原数列的偶数项和奇数项的离散傅立叶变换,递归的子结构出现了
放到原式中就变成了

这样,只要分别计算出X_e和X_o并附加2*n级别的计算量,就能完成原本要n^2级别的计算量才能完成的运算了
不过毕竟是最基础的方法&amp;#8230;代码的运行效率还有很多优化的余地
虽然说是基2的,但是实际上只是个特例
实质上这个方法并不是对分成2份才有效
比如以n=6作为例子,既可以分成2份:

也可以分成3份:

而且依然满足递归的子结构的要求
也就是,n=a*b的情况下,可以分成a份,计算a个长度为b的子序列的离散傅立叶变换值,附加a*n的级别的运算量,就可以完成n点的离散傅立叶变换了
这样,对任意的n都可以做快速傅立叶变换了:分解质因数
可惜n是质数的时候,貌似只能用定义式了&amp;#8230;
基2,4,8的情况下,在代码级别上还可以有很好的优化
因为这时会让中间很多步骤中有关W的复数运算简化很多,不用复数乘法,而用实部虚部做较少的加减法来完成
浮点数真是功不可没啊&amp;#8230;用很小的精度代价让一个浮点数包含了原序列每个数的一部分信息&amp;#8230;就像全息照相一样呢&amp;#8230;&lt;img src=&quot;http://www1.feedsky.com/t1/507215664/AC_ben1222/feedsky/s.gif?r=http://www.ben1222.com/wordpress/archives/32449&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/AC_ben1222/507215664/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/AC_ben1222/507215664/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description><category>心血来潮</category><category>数学</category><pubDate>Wed, 29 Sep 2010 17:06:14 +0800</pubDate><author>ben1222</author><comments>http://www.ben1222.com/wordpress/archives/32449#comments</comments><guid isPermaLink="false">http://www.ben1222.com/wordpress/?p=32449</guid><dc:creator>ben1222</dc:creator><fs:srclink>http://www.ben1222.com/wordpress/archives/32449</fs:srclink><fs:srcfeed>http://www.ben1222.com/wordpress/feed</fs:srcfeed><fs:itemid>feedsky/AC_ben1222/~8105908/507215664/5755039</fs:itemid></item><item><title>contest zju Monthly August 2010</title><link>http://www.ben1222.com/wordpress/archives/32444</link><content:encoded>&lt;p&gt;昨天是&lt;a href=&quot;http://acm.zju.edu.cn/onlinejudge/showContestProblems.do?contestId=313&quot;&gt;ZOJ Monthly, August 2010 &lt;/a&gt;&lt;br /&gt;
好久没做题了&amp;#8230;N天前就看到这次月赛是东方专场&amp;#8230;于是想着一定要去凑凑热闹&amp;#8230;&lt;br /&gt;
不过最后还是只做了4个小时&amp;#8230;最后一小时忙别的事情去了&amp;#8230;&lt;/p&gt;
&lt;p&gt;一看题数&amp;#8230;居然有13题&amp;#8230;&lt;!--话说从th12.3到th12.5到th12.8...th13何时才能出呢...--&gt;&lt;br /&gt;
题号也变成了各种人物的名字了&amp;#8230;&lt;/p&gt;
&lt;p&gt;一上来是&lt;a href=&quot;http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=3915&quot;&gt;第阿求题&lt;/a&gt;&amp;#8230;禁语吗&amp;#8230;&lt;!--话说笨蛋为什么也是禁语?...不过标题的缩写倒是(看了解题报告才注意到- -|||)--&gt;&amp;#8230;glob和regex的转换&amp;#8230;看了下样例感觉不难&amp;#8230;但是害怕有一堆要考虑的东西&amp;#8230;&lt;/p&gt;
&lt;p&gt;然后是&lt;a href=&quot;http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=3916&quot;&gt;第⑨题&lt;/a&gt;&amp;#8230;算术教室&amp;#8230;n个人围成一圈随机选取m个人,其中有9人是连着坐的概率是多少呢?&amp;#8230;第一反应就是感觉是组合数方面的于是无视中&amp;#8230;&lt;/p&gt;
&lt;p&gt;然后看到已经有人过题了&amp;#8230;&lt;a href=&quot;http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=3926&quot;&gt;第妖梦题&lt;/a&gt;&amp;#8230;为大胃王幽幽子准备食物&amp;#8230;第i天能准备bi份食物,但是要吃掉ai份食物&amp;#8230;希望食物越新鲜越好&amp;#8230;求各天准备多少食物&amp;#8230;果然很水呢&amp;#8230;从后往前扫一遍就可以了&amp;#8230;&lt;br /&gt;
本想就看看题目娱乐下&amp;#8230;结果一不小心手痒了&amp;#8230;&lt;br /&gt;
于是敲了下&amp;#8230;过了&amp;#8230;&lt;/p&gt;
&lt;p&gt;接着发现又一题有人过了&amp;#8230;&lt;a href=&quot;http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=3925&quot;&gt;第四季题&lt;/a&gt;&amp;#8230;黑白分明呢&amp;#8230;用了Bad Apple影绘的图&amp;#8230;&lt;!--不过感觉如果用那张比较左右对称的四季的图比较好吧?--&gt;&lt;br /&gt;
把24位点阵图转换成灰度然后再根据公式二值化&amp;#8230;也很水&amp;#8230;看到那句&amp;#8221;All divisions are truncated divisions.&amp;#8221;后就想&amp;#8230;会有人栽在这里吧&amp;#8230;后来真发现有个id是&amp;#8221;一句All divisions are truncated divisions. 让我wa了10次，杯具了整个下午！！！&amp;#8221;&lt;br /&gt;
但是敲了一下&amp;#8230;在本地测试的时候用scanf(&amp;#8220;#%2lx%2lx%2lx&amp;#8221;,&amp;amp;r,&amp;amp;g,&amp;amp;b);来读入,结果本地测试死循环了&amp;#8230;难道#也是特殊字符?于是改成了scanf(&amp;#8220;%#%2lx%2lx%2lx&amp;#8221;,&amp;amp;r,&amp;amp;g,&amp;amp;b);在本地测试通过了&amp;#8230;可是交上去OLE了&amp;#8230;难道编译器不同吗&amp;#8230;&lt;br /&gt;
于是很郁闷的改成了scanf(&amp;#8220;%s&amp;#8221;,str);sscanf(str+1,&amp;#8221;%2lX%2lX%2lX&amp;#8221;,&amp;amp;r,&amp;amp;g,&amp;amp;b);&lt;br /&gt;
题目描述里面没说输出的9或者空格之间需要空格隔开&amp;#8230;但是sample output里面却隔开了&amp;#8230;于是改成没有空格隔开结果wa了&amp;#8230;&lt;br /&gt;
最后再改回来有空格隔开的才AC&amp;#8230;&lt;/p&gt;
&lt;p&gt;接着看到&lt;a href=&quot;http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=3923&quot;&gt;第灵梦题&lt;/a&gt;有人过了&amp;#8230;塞钱箱&amp;#8230;说是第i天请人赛钱可以得到si元,但是如果这么做了,下一次请人赛钱的时间必须在xi天后,yi天前&amp;#8230;求如果第一天请人赛钱的话,最多能得到多少钱&amp;#8230;&lt;br /&gt;
稍微想了下,一个简单的dp而已&amp;#8230;dp[i]表示第i天请人赛钱的话,从第i天开始最多能得到多少钱&amp;#8230;转移时只要找xi天后,yi天前这段区间的dp值最大的即可&amp;#8230;&lt;br /&gt;
然后一看规模&amp;#8230;5万天&amp;#8230;囧了&amp;#8230;不过求区间最大值而已&amp;#8230;解题报告虽然说用线段树&amp;#8230;可当时我想到的却是rmq&amp;#8230;&lt;br /&gt;
但是rmq是一次性的预处理的&amp;#8230;于是就YY着改造了一下,依然沿袭rmq那种思路:分成logN层,每层有N个数,第i层的第j个数表示在[j,j+2^i-1]的范围内最大值是多少&lt;br /&gt;
然后从后往前边dp边insert,对于第i天来说,这天之后的每一天的dp值和rmq数组值都是已经得到了的,于是就能得到第i天的dp值,然后将这个值插入进rmq数组,更新第i个数的那logN层数字,总复杂度O(nlogn)&lt;br /&gt;
很快写好了&amp;#8230;提交却下标越界&amp;#8230;然后发现数组开小了- -|||&amp;#8230;改后AC&lt;br /&gt;
在看解题报告的时候发现评论里有说&lt;a href=&quot;http://www.topcoder.com/tc?module=Static&amp;amp;d1=tutorials&amp;amp;d2=lowestCommonAncestor&quot;&gt;Sparse Table&lt;/a&gt;什么的&amp;#8230;原来我那方法叫这个名字啊&amp;#8230;&lt;/p&gt;
&lt;p&gt;接下来看到&lt;a href=&quot;http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=3920&quot;&gt;第辉夜题&lt;/a&gt;有人过&amp;#8230;妹红要埋伏辉夜吗&amp;#8230;题目是求一张图上从起点到终点之间的必经之路&amp;#8230;也就是桥?&amp;#8230;模板题吗&amp;#8230;可惜我只有割点的模板&amp;#8230;于是忽略了这题&amp;#8230;&lt;/p&gt;
&lt;p&gt;接下来看到&lt;a href=&quot;http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=3917&quot;&gt;第芙兰题&lt;/a&gt;有人过了&amp;#8230;永夜抄吗&amp;#8230;&lt;!--话说永夜抄和二小姐有什么关系?--&gt;&amp;#8230;看到迷途竹林以为又是图论有关的&amp;#8230;结果却不是这样&amp;#8230;&lt;br /&gt;
一共有n个房间,第i个房间有xi个ITEM,每个是ai点,有yi个TIME,每个是bi点,每次去一个房间把所有这个房间的ITEM和TIME收完回到入口,直到所有房间的ITEM和TIME都收完&amp;#8230;&lt;br /&gt;
拿一个点数是a的ITEM的时候可以得到IV分,并且TV增加a&lt;br /&gt;
拿一个点数是b的TIME的时候可以得到TV分,并且IV增加b&lt;br /&gt;
一开始IV和TV值为0,求最多能得到多少分&lt;br /&gt;
因为进一个房间后,该房间所有的ITEM和TIME都要收完,所以先考虑在一个房间内的情况,该按什么顺序收最好&lt;br /&gt;
小数据手动演算了一下,发现分数会增加IV*xi+TV*yi+u*ai+v*bi,并且u+v=xi*yi,并且对任何正整数的u,v搭配都总有一种顺序可以满足&lt;br /&gt;
于是得到了在第i个房间内最多分数会增加IV*xi+TV*yi+max{ai,bi}*xi*yi的结论,可见ai,bi和IV,TV是分离的,因此外面用一层状态压缩dp计算2^15个状态就可以了&lt;br /&gt;
dp[state]表示state的位为1的对应的房间已经去过的情况下,所得到的最大分数&lt;br /&gt;
并且这个情况下的IV和TV值是固定的,轻轻松松的上吧&amp;#8230;&lt;/p&gt;
&lt;p&gt;又看到&lt;a href=&quot;http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=3919&quot;&gt;第因幡题&lt;/a&gt;有人过&amp;#8230;腹黑兔啊&amp;#8230;看似公平的游戏却把规则定的自己总有必胜策略&amp;#8230;想到东方夜神雪里面那个取硬币小游戏&amp;#8230;轮流取1~3枚,取走最后一枚的人输&amp;#8230;可是起始的硬币数量并不是随机的&amp;#8230;而是4k+1&amp;#8230;太囧了&amp;#8230;玩了好几盘才发现原来这游戏是必输的&amp;#8230;&lt;br /&gt;
回到这里&amp;#8230;这次是类似孔明棋的小游戏&amp;#8230;每次可以选一个棋子往4个方向之一跳,但是必须跳过别的棋子并且最终落在某个空格上,中间可以跳过连续多个棋子,被跳过的棋子都会被拿走&amp;#8230;&lt;br /&gt;
给定初始棋局,问让铃仙和因幡谁先走可以使得因幡有必胜策略&amp;#8230;&lt;br /&gt;
一看规模才5*5&amp;#8230;想想2^25也不是什么大数字&amp;#8230;加上有一句&amp;#8221;It&amp;#8217;s guaranteed that no more than 61.8% of them are &amp;#8216;e&amp;#8217;s.&amp;#8221;&amp;#8230;感觉状态会很少&amp;#8230;于是直接暴力记录博弈状态&amp;#8230;&lt;br /&gt;
第一次交忘记处理了选取的棋子是一排棋子中间的某个棋子的情况&amp;#8230;改后AC&lt;/p&gt;
&lt;p&gt;然后&amp;#8230;&lt;a href=&quot;http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=3921&quot;&gt;第魔里沙题&lt;/a&gt;有人过&amp;#8230;魔炮啊&amp;#8230;是个计算几何&amp;#8230;求往什么方向射可以打中最多点,魔炮的范围是个顶点为原点的抛物线&lt;br /&gt;
抛物线啊&amp;#8230;想到每个点有个可被命中的角度范围,也就是魔炮的方向在这个范围内,这个点可以被打中,但是对不同距离的点而言,这个范围的大小是不一样的&amp;#8230;&lt;br /&gt;
计算了下,二次系数是a的抛物线和半径为r的圆的交点&lt;/p&gt;
&lt;pre&gt;y坐标是: y=(sqrt(1+4*a*a*r*r)-1)/(2*a)&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2010/08/marisa.png&quot;&gt;&lt;img class=&quot;alignnone size-full wp-image-32445&quot; title=&quot;marisa&quot; src=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2010/08/marisa.png&quot; alt=&quot;&quot; width=&quot;443&quot; height=&quot;412&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
设上图中P点对应的极角为alpha,那么当魔炮中轴对着[alpha-theta, alpha+theta]区间中任意的极角时,P点就能被打中&lt;/p&gt;
&lt;pre&gt;这个theta值为: theta=atan(x/y) =atan(sqrt(y/a)/y)=atan(sqrt(1/y*a))&lt;/pre&gt;
&lt;p&gt;于是问题转换成了,找一个极角,使得它被最多的区间覆盖&amp;#8230;而数据规模有3万个点&amp;#8230;&lt;br /&gt;
脑中第一个闪现的是离散化+线段树&amp;#8230;显然太麻烦了&amp;#8230;&lt;br /&gt;
然后想起以前某些题&amp;#8230;比如矩形求并之类的&amp;#8230;貌似只要看左右边界判断出入就行&amp;#8230;&lt;br /&gt;
于是想到了用这个方法就好,将区间变成端点,左端点标记为入,右端点标记为出,然后将所有端点按大小(这里是极角)排序&lt;br /&gt;
然后从前往后扫描,遇到标记为入的端点就当前覆盖区间数加一,遇到标记为出的端点就当前覆盖区间数减一,扫描一遍下来,取当前覆盖区间数的最大值&amp;#8230;就是所需的答案daze&lt;br /&gt;
另外处理下跨边界相邻的情况,就是当区间在[0,2pi]的两边时,就多插入个小于0的那个入端点和大于2pi的那个出端点&lt;/p&gt;
&lt;p&gt;然后&amp;#8230;有别的事情&amp;#8230;于是就看看题目然后不继续做了&amp;#8230;&lt;br /&gt;
&lt;a href=&quot;http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=3918&quot;&gt;第极题&lt;/a&gt;&amp;#8230;姬海棠也有啊&amp;#8230;貌似是找最安全点&amp;#8230;话说游戏里寅丸星的香蕉激光实在是太恶心了&amp;#8230;但是这题目里面是射线&amp;#8230;而且是曼哈顿距离?&amp;#8230;直接傻眼了&amp;#8230;点和线的曼哈顿距离?那是什么?怎么求?&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=3922&quot;&gt;第图书题&lt;/a&gt;&amp;#8230;不动的大图书馆&amp;#8230;题目是一共m种元素卡,一共有n种符文,每种元素卡上等概率出现这n种符文中的一种,求m种元素卡各取一张的话,有多少概率可以使得这些卡上的符文至少有l个是相同的&amp;#8230;输出成既约分数&amp;#8230;&lt;br /&gt;
又是组合数类的题目吗&amp;#8230;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=3949&quot;&gt;第咲夜题&lt;/a&gt;&amp;#8230;时间的操作&amp;#8230;哦不&amp;#8230;这题是求表达式结果是某个类型的可能性个数?&lt;br /&gt;
题目很长呢&amp;#8230;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=3927&quot;&gt;第幽幽子题&lt;/a&gt;&amp;#8230;赏花会啊&amp;#8230;真好呢&amp;#8230;&lt;br /&gt;
又是做食物&amp;#8230;这次是第i天幽幽子会吃掉ai份食物&amp;#8230;妖梦每天可以做L份食物,或者花一天时间锻炼自己使得L值增加1&amp;#8230;求N天过后剩下的食物最多还有多少份&amp;#8230;&lt;!--话说幽幽子会生气吗?--&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://watashi.ws/blog/1476/zojmonthly1008/&quot;&gt;这里&lt;/a&gt;或者&lt;a href=&quot;http://watashi.ws/blog/touhou-monthly/touhou-monthly-solutions/&quot;&gt;这里&lt;/a&gt;是官方解题报告吧&amp;#8230;&lt;/p&gt;
&lt;p&gt;下面是我灵梦,芙兰,魔里沙题的代码&amp;#8230;&lt;br /&gt;
&lt;span id=&quot;more-32444&quot;&gt;&lt;/span&gt;&lt;br /&gt;
第灵梦题的代码:&lt;/p&gt;
&lt;pre&gt;#include&amp;lt;stdio.h&amp;gt;
/*
ZOJ monthly 201008
红白
*/
#define N 50010
long dp[N];
//dp[i]=max_money get if ask for money at day i
long rmq[18][N],bi[19];
long n;
long money[N],begin[N],end[N];
long query(long pa,long pb){
 long j,d;
 if(pa&amp;gt;pb){j=pa;pa=pb;pb=j;}
 if(pa&amp;gt;=n||pa&amp;lt;0)return 0;
 if(pb&amp;gt;=n)pb=n-1;
 d=pb-pa+1;
 for(j=0;bi[j]&amp;lt;=d;j++);
 j--;
 pa=rmq[j][pa];
 pb=rmq[j][pb-bi[j]+1];
 if(pa&amp;lt;pb)pa=pb;
 return pa;
}
void insert(long p,long val){
 long j;
 for(j=0;j&amp;lt;18;j++){
  rmq[j][p]=val;
  long next=bi[j]+p;
  if(next&amp;lt;n){
   if(rmq[j][next]&amp;gt;val)val=rmq[j][next];
  }
 }
}
int main(){
 long i;
 for(i=0;i&amp;lt;19;i++)bi[i]=((long)1)&amp;lt;&amp;lt;i;
 while(scanf(&quot;%ld&quot;,&amp;amp;n)!=EOF){
  for(i=0;i&amp;lt;n;i++)scanf(&quot;%ld%ld%ld&quot;,money+i,begin+i,end+i);
  long j;
  for(j=0;j&amp;lt;18;j++)for(i=0;i&amp;lt;n;i++)rmq[j][i]=-1;
  for(i=n-1;i&amp;gt;=0;i--){
   dp[i]=money[i]+query(i+begin[i],i+end[i]-1);
   insert(i,dp[i]);
  }
  printf(&quot;%ld\n&quot;,dp[0]);
 }
 return 0;
}
&lt;/pre&gt;
&lt;p&gt;第芙兰题的代码:&lt;/p&gt;
&lt;pre&gt;#include&amp;lt;stdio.h&amp;gt;
#include&amp;lt;memory.h&amp;gt;
/*
ZOJ monthly 201008
二小姐

in part_i:
 point+=IV*xi+TV*yi+max{ai,bi}*xi*yi
 IV+=yi*bi
 TV+=xi*ai
dp[state(1&amp;lt;&amp;lt;n)]=max_point when collected in parts[state.bits]
*/
#define N 32768
long bi[17];
long dp[N],s_iv[N],s_tv[N];
long n;
long xi[15],yi[15],a[15],b[15];
long add_point[15];
long fun(long state){
 if(dp[state]!=-1)return dp[state];
 long i;
 long best=0;
 for(i=0;i&amp;lt;n;i++)if(state&amp;amp;bi[i]){
  long prev=state^bi[i];
  long iv=s_iv[prev],tv=s_tv[prev];
  long val=fun(prev)+iv*xi[i]+tv*yi[i]+add_point[i];
  if(val&amp;gt;best)best=val;
 }
 return dp[state]=best;
}
int main(){
 long i;
 for(i=0;i&amp;lt;17;i++)bi[i]=((long)1)&amp;lt;&amp;lt;i;
 while(scanf(&quot;%ld&quot;,&amp;amp;n)!=EOF){
  for(i=0;i&amp;lt;n;i++){
   scanf(&quot;%ld%ld%ld%ld&quot;,a+i,b+i,xi+i,yi+i);
   if(a[i]&amp;gt;b[i])add_point[i]=a[i]*xi[i]*yi[i];
   else add_point[i]=b[i]*xi[i]*yi[i];
  }
  memset(dp,-1,sizeof(dp));
  long j;
  for(i=0;i&amp;lt;bi[n];i++){
   long iv=0,tv=0;
   for(j=0;j&amp;lt;n;j++)if(i&amp;amp;bi[j]){
    iv+=yi[j]*b[j];
    tv+=xi[j]*a[j];
   }
   s_iv[i]=iv;
   s_tv[i]=tv;
  }
  printf(&quot;%ld\n&quot;,fun(bi[n]-1));
 }
 return 0;
}
&lt;/pre&gt;
&lt;p&gt;第魔里沙题的代码:&lt;/p&gt;
&lt;pre&gt;#include&amp;lt;stdio.h&amp;gt;
#include&amp;lt;math.h&amp;gt;
#include&amp;lt;algorithm&amp;gt;
using namespace std;
/*
ZOJ monthly 201008
黑白

y=a*x^2
x*x+y*y=r*r
y=a*(r^2-y^2)
y=a*r*r-a*y*y
a*y^2+y-a*r*r=0
y=(sqrt(1+4*a*a*r*r)-1)/(2*a)
theta=atan(x/y) =atan(sqrt(y/a)/y)=atan(sqrt(1/y*a))
*/
typedef struct{
 double rad;
 char out;
}point;
bool operator&amp;lt;(const point&amp;amp;a,const point&amp;amp;b){
 return a.rad&amp;lt;b.rad||(a.rad==b.rad&amp;amp;&amp;amp;a.out&amp;lt;b.out);
}
#define N 30010
#define PI 3.14159265358979
point seg[N*3];
double xi[N],yi[N];
long nseg;
#define ENSEG(r,o) {seg[nseg].rad=r;seg[nseg].out=o;nseg++;}
int main(){
 long n;
 double a;
 while(scanf(&quot;%ld%lf&quot;,&amp;amp;n,&amp;amp;a)!=EOF){
  long i;
  for(i=0;i&amp;lt;n;i++)scanf(&quot;%lf&quot;,xi+i);
  for(i=0;i&amp;lt;n;i++)scanf(&quot;%lf&quot;,yi+i);
  long addition=0;
  nseg=0;
  for(i=0;i&amp;lt;n;i++){
   double r2=xi[i]*xi[i]+yi[i]*yi[i];
   double dy=(sqrt(1.0+4*a*a*r2)-1)/(2*a);
   if(dy&amp;lt;=0){addition++;continue;}
   double theta=atan(sqrt(1.0/(dy*a)));
   double t0=atan2(yi[i],xi[i]);
   if(t0&amp;lt;0)t0+=PI*2;

   double in=t0-theta,out=t0+theta;
   ENSEG(in,0)
   ENSEG(out,1)
   if(in&amp;lt;0){
    ENSEG(in+PI*2,0)
    ENSEG(out+PI*2,1)
   }
   if(out&amp;gt;=PI*2){
    ENSEG(in-PI*2,0)
    ENSEG(out-PI*2,1)
   }
  }
  sort(seg,seg+nseg);
  long ans=0,now=0;
  for(i=0;i&amp;lt;nseg;i++){
   if(seg[i].out)now--;
   else now++;
   if(now&amp;gt;ans)ans=now;
  }
  printf(&quot;%ld daze\n&quot;,ans+addition);
 }
 return 0;
}
&lt;/pre&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/507215665/AC_ben1222/feedsky/s.gif?r=http://www.ben1222.com/wordpress/archives/32444&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/AC_ben1222/507215665/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/AC_ben1222/507215665/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.ben1222.com/wordpress/archives/32444/feed</wfw:commentRss><slash:comments>2</slash:comments><description>昨天是ZOJ Monthly, August 2010 
好久没做题了&amp;#8230;N天前就看到这次月赛是东方专场&amp;#8230;于是想着一定要去凑凑热闹&amp;#8230;
不过最后还是只做了4个小时&amp;#8230;最后一小时忙别的事情去了&amp;#8230;
一看题数&amp;#8230;居然有13题&amp;#8230;
题号也变成了各种人物的名字了&amp;#8230;
一上来是第阿求题&amp;#8230;禁语吗&amp;#8230;&amp;#8230;glob和regex的转换&amp;#8230;看了下样例感觉不难&amp;#8230;但是害怕有一堆要考虑的东西&amp;#8230;
然后是第⑨题&amp;#8230;算术教室&amp;#8230;n个人围成一圈随机选取m个人,其中有9人是连着坐的概率是多少呢?&amp;#8230;第一反应就是感觉是组合数方面的于是无视中&amp;#8230;
然后看到已经有人过题了&amp;#8230;第妖梦题&amp;#8230;为大胃王幽幽子准备食物&amp;#8230;第i天能准备bi份食物,但是要吃掉ai份食物&amp;#8230;希望食物越新鲜越好&amp;#8230;求各天准备多少食物&amp;#8230;果然很水呢&amp;#8230;从后往前扫一遍就可以了&amp;#8230;
本想就看看题目娱乐下&amp;#8230;结果一不小心手痒了&amp;#8230;
于是敲了下&amp;#8230;过了&amp;#8230;
接着发现又一题有人过了&amp;#8230;第四季题&amp;#8230;黑白分明呢&amp;#8230;用了Bad Apple影绘的图&amp;#8230;
把24位点阵图转换成灰度然后再根据公式二值化&amp;#8230;也很水&amp;#8230;看到那句&amp;#8221;All divisions are truncated divisions.&amp;#8221;后就想&amp;#8230;会有人栽在这里吧&amp;#8230;后来真发现有个id是&amp;#8221;一句All divisions are truncated divisions. 让我wa了10次，杯具了整个下午！！！&amp;#8221;
但是敲了一下&amp;#8230;在本地测试的时候用scanf(&amp;#8220;#%2lx%2lx%2lx&amp;#8221;,&amp;#38;r,&amp;#38;g,&amp;#38;b);来读入,结果本地测试死循环了&amp;#8230;难道#也是特殊字符?于是改成了scanf(&amp;#8220;%#%2lx%2lx%2lx&amp;#8221;,&amp;#38;r,&amp;#38;g,&amp;#38;b);在本地测试通过了&amp;#8230;可是交上去OLE了&amp;#8230;难道编译器不同吗&amp;#8230;
于是很郁闷的改成了scanf(&amp;#8220;%s&amp;#8221;,str);sscanf(str+1,&amp;#8221;%2lX%2lX%2lX&amp;#8221;,&amp;#38;r,&amp;#38;g,&amp;#38;b);
题目描述里面没说输出的9或者空格之间需要空格隔开&amp;#8230;但是sample output里面却隔开了&amp;#8230;于是改成没有空格隔开结果wa了&amp;#8230;
最后再改回来有空格隔开的才AC&amp;#8230;
接着看到第灵梦题有人过了&amp;#8230;塞钱箱&amp;#8230;说是第i天请人赛钱可以得到si元,但是如果这么做了,下一次请人赛钱的时间必须在xi天后,yi天前&amp;#8230;求如果第一天请人赛钱的话,最多能得到多少钱&amp;#8230;
稍微想了下,一个简单的dp而已&amp;#8230;dp[i]表示第i天请人赛钱的话,从第i天开始最多能得到多少钱&amp;#8230;转移时只要找xi天后,yi天前这段区间的dp值最大的即可&amp;#8230;
然后一看规模&amp;#8230;5万天&amp;#8230;囧了&amp;#8230;不过求区间最大值而已&amp;#8230;解题报告虽然说用线段树&amp;#8230;可当时我想到的却是rmq&amp;#8230;
但是rmq是一次性的预处理的&amp;#8230;于是就YY着改造了一下,依然沿袭rmq那种思路:分成logN层,每层有N个数,第i层的第j个数表示在[j,j+2^i-1]的范围内最大值是多少
然后从后往前边dp边insert,对于第i天来说,这天之后的每一天的dp值和rmq数组值都是已经得到了的,于是就能得到第i天的dp值,然后将这个值插入进rmq数组,更新第i个数的那logN层数字,总复杂度O(nlogn)
很快写好了&amp;#8230;提交却下标越界&amp;#8230;然后发现数组开小了- -&amp;#124;&amp;#124;&amp;#124;&amp;#8230;改后AC
在看解题报告的时候发现评论里有说Sparse Table什么的&amp;#8230;原来我那方法叫这个名字啊&amp;#8230;
接下来看到第辉夜题有人过&amp;#8230;妹红要埋伏辉夜吗&amp;#8230;题目是求一张图上从起点到终点之间的必经之路&amp;#8230;也就是桥?&amp;#8230;模板题吗&amp;#8230;可惜我只有割点的模板&amp;#8230;于是忽略了这题&amp;#8230;
接下来看到第芙兰题有人过了&amp;#8230;永夜抄吗&amp;#8230;&amp;#8230;看到迷途竹林以为又是图论有关的&amp;#8230;结果却不是这样&amp;#8230;
一共有n个房间,第i个房间有xi个ITEM,每个是ai点,有yi个TIME,每个是bi点,每次去一个房间把所有这个房间的ITEM和TIME收完回到入口,直到所有房间的ITEM和TIME都收完&amp;#8230;
拿一个点数是a的ITEM的时候可以得到IV分,并且TV增加a
拿一个点数是b的TIME的时候可以得到TV分,并且IV增加b
一开始IV和TV值为0,求最多能得到多少分
因为进一个房间后,该房间所有的ITEM和TIME都要收完,所以先考虑在一个房间内的情况,该按什么顺序收最好
小数据手动演算了一下,发现分数会增加IV*xi+TV*yi+u*ai+v*bi,并且u+v=xi*yi,并且对任何正整数的u,v搭配都总有一种顺序可以满足
于是得到了在第i个房间内最多分数会增加IV*xi+TV*yi+max{ai,bi}*xi*yi的结论,可见ai,bi和IV,TV是分离的,因此外面用一层状态压缩dp计算2^15个状态就可以了
dp[state]表示state的位为1的对应的房间已经去过的情况下,所得到的最大分数
并且这个情况下的IV和TV值是固定的,轻轻松松的上吧&amp;#8230;
又看到第因幡题有人过&amp;#8230;腹黑兔啊&amp;#8230;看似公平的游戏却把规则定的自己总有必胜策略&amp;#8230;想到东方夜神雪里面那个取硬币小游戏&amp;#8230;轮流取1~3枚,取走最后一枚的人输&amp;#8230;可是起始的硬币数量并不是随机的&amp;#8230;而是4k+1&amp;#8230;太囧了&amp;#8230;玩了好几盘才发现原来这游戏是必输的&amp;#8230;
回到这里&amp;#8230;这次是类似孔明棋的小游戏&amp;#8230;每次可以选一个棋子往4个方向之一跳,但是必须跳过别的棋子并且最终落在某个空格上,中间可以跳过连续多个棋子,被跳过的棋子都会被拿走&amp;#8230;
给定初始棋局,问让铃仙和因幡谁先走可以使得因幡有必胜策略&amp;#8230;
一看规模才5*5&amp;#8230;想想2^25也不是什么大数字&amp;#8230;加上有一句&amp;#8221;It&amp;#8217;s guaranteed that no more than 61.8% of them are &amp;#8216;e&amp;#8217;s.&amp;#8221;&amp;#8230;感觉状态会很少&amp;#8230;于是直接暴力记录博弈状态&amp;#8230;
第一次交忘记处理了选取的棋子是一排棋子中间的某个棋子的情况&amp;#8230;改后AC
然后&amp;#8230;第魔里沙题有人过&amp;#8230;魔炮啊&amp;#8230;是个计算几何&amp;#8230;求往什么方向射可以打中最多点,魔炮的范围是个顶点为原点的抛物线
抛物线啊&amp;#8230;想到每个点有个可被命中的角度范围,也就是魔炮的方向在这个范围内,这个点可以被打中,但是对不同距离的点而言,这个范围的大小是不一样的&amp;#8230;
计算了下,二次系数是a的抛物线和半径为r的圆的交点
y坐标是: y=(sqrt(1+4*a*a*r*r)-1)/(2*a)

设上图中P点对应的极角为alpha,那么当魔炮中轴对着[alpha-theta, alpha+theta]区间中任意的极角时,P点就能被打中
这个theta值为: theta=atan(x/y) =atan(sqrt(y/a)/y)=atan(sqrt(1/y*a))
于是问题转换成了,找一个极角,使得它被最多的区间覆盖&amp;#8230;而数据规模有3万个点&amp;#8230;
脑中第一个闪现的是离散化+线段树&amp;#8230;显然太麻烦了&amp;#8230;
然后想起以前某些题&amp;#8230;比如矩形求并之类的&amp;#8230;貌似只要看左右边界判断出入就行&amp;#8230;
于是想到了用这个方法就好,将区间变成端点,左端点标记为入,右端点标记为出,然后将所有端点按大小(这里是极角)排序
然后从前往后扫描,遇到标记为入的端点就当前覆盖区间数加一,遇到标记为出的端点就当前覆盖区间数减一,扫描一遍下来,取当前覆盖区间数的最大值&amp;#8230;就是所需的答案daze
另外处理下跨边界相邻的情况,就是当区间在[0,2pi]的两边时,就多插入个小于0的那个入端点和大于2pi的那个出端点
然后&amp;#8230;有别的事情&amp;#8230;于是就看看题目然后不继续做了&amp;#8230;
第极题&amp;#8230;姬海棠也有啊&amp;#8230;貌似是找最安全点&amp;#8230;话说游戏里寅丸星的香蕉激光实在是太恶心了&amp;#8230;但是这题目里面是射线&amp;#8230;而且是曼哈顿距离?&amp;#8230;直接傻眼了&amp;#8230;点和线的曼哈顿距离?那是什么?怎么求?
第图书题&amp;#8230;不动的大图书馆&amp;#8230;题目是一共m种元素卡,一共有n种符文,每种元素卡上等概率出现这n种符文中的一种,求m种元素卡各取一张的话,有多少概率可以使得这些卡上的符文至少有l个是相同的&amp;#8230;输出成既约分数&amp;#8230;
又是组合数类的题目吗&amp;#8230;
第咲夜题&amp;#8230;时间的操作&amp;#8230;哦不&amp;#8230;这题是求表达式结果是某个类型的可能性个数?
题目很长呢&amp;#8230;
第幽幽子题&amp;#8230;赏花会啊&amp;#8230;真好呢&amp;#8230;
又是做食物&amp;#8230;这次是第i天幽幽子会吃掉ai份食物&amp;#8230;妖梦每天可以做L份食物,或者花一天时间锻炼自己使得L值增加1&amp;#8230;求N天过后剩下的食物最多还有多少份&amp;#8230;
这里或者这里是官方解题报告吧&amp;#8230;
下面是我灵梦,芙兰,魔里沙题的代码&amp;#8230;

第灵梦题的代码:
#include&amp;#60;stdio.h&amp;#62;
/*
ZOJ monthly 201008
红白
*/
#define N 50010
long dp[N];
//dp[i]=max_money get if ask for money at day i
long rmq[18][N],bi[19];
long n;
long money[N],begin[N],end[N];
long query(long pa,long pb){
 long j,d;
 if(pa&amp;#62;pb){j=pa;pa=pb;pb=j;}
 if(pa&amp;#62;=n&amp;#124;&amp;#124;pa&amp;#60;0)return [...]&lt;img src=&quot;http://www1.feedsky.com/t1/507215665/AC_ben1222/feedsky/s.gif?r=http://www.ben1222.com/wordpress/archives/32444&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/AC_ben1222/507215665/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/AC_ben1222/507215665/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description><category>贪心</category><category>状态压缩</category><category>acm</category><category>contest</category><category>ZJU</category><category>rmq</category><category>东方</category><category>code</category><category>accept</category><category>博弈</category><category>计算几何</category><category>dp</category><category>圆</category><pubDate>Mon, 23 Aug 2010 15:41:06 +0800</pubDate><author>ben1222</author><comments>http://www.ben1222.com/wordpress/archives/32444#comments</comments><guid isPermaLink="false">http://www.ben1222.com/wordpress/?p=32444</guid><dc:creator>ben1222</dc:creator><fs:srclink>http://www.ben1222.com/wordpress/archives/32444</fs:srclink><fs:srcfeed>http://www.ben1222.com/wordpress/feed</fs:srcfeed><fs:itemid>feedsky/AC_ben1222/~8105908/507215665/5755039</fs:itemid></item><item><title>objective-c 的一些东西</title><link>http://www.ben1222.com/wordpress/archives/32439</link><content:encoded>&lt;p&gt;最近在看&lt;a href=&quot;http://en.wikipedia.org/wiki/Objective-c&quot;&gt;Objective-c&lt;/a&gt;&lt;br /&gt;
虽说是c语言扩展出来的&amp;#8230;可是这里面的对象甚至类本身却是动态的&amp;#8230;&lt;br /&gt;
查了下貌似这叫&lt;a href=&quot;http://en.wikipedia.org/wiki/Reflection_%28computer_science%29&quot;&gt;反射&lt;/a&gt;?&lt;br /&gt;
倒是和不少脚本型的语言很像&amp;#8230;&lt;/p&gt;
&lt;p&gt;了解下语法之类的可以看看&lt;a href=&quot;http://www.otierney.net/objective-c.html&quot;&gt;这里&lt;/a&gt;(这篇东西同时有&lt;a href=&quot;http://www.otierney.net/objective-c.html.zh-tw.big5&quot;&gt;中文版&lt;/a&gt;),&lt;a href=&quot;http://en.wikipedia.org/wiki/Objective-c&quot;&gt;Wiki&lt;/a&gt;上还有些和C++的对比&lt;/p&gt;
&lt;p&gt;一点点看下来,一开始还没什么,感觉只是语法变了下&lt;br /&gt;
嗯&amp;#8230;#include变成#import&lt;/p&gt;
&lt;p&gt;创建类用@interface,还可以继承,不过只能继承一个父类&lt;br /&gt;
objective-c的方法名很有特点&amp;#8230;并不是完整名称后面跟参数列表&amp;#8230;而是两者交织起来&amp;#8230;&lt;br /&gt;
虽然这样打字可能要多些(没有带提示功能的编辑器的话,很吃力&amp;#8230;),但是阅读起来更加明晰,不会出现忘记第几个参数是什么作用的情况了&lt;/p&gt;
&lt;p&gt;实现类在@implementation块内写&lt;br /&gt;
这里就有些舒服了,方法名直接复制到对应的implementation块中就可以开始写方法的内容了&lt;br /&gt;
用C++的时候,要把成员函数的声明复制过来,然后在返回类型和函数名之间加上&amp;#8221;类名::&amp;#8221;的东西,感觉很麻烦呢&amp;#8230;&lt;/p&gt;
&lt;p&gt;this变成了self,要调用父类的方法而自身却重载过了这个方法时,可以对super调用方法&lt;br /&gt;
用-的是对象的method,用+的是类的method,后者相当于C++的静态成员函数&lt;/p&gt;
&lt;p&gt;id类型是万能的对象,就像void*,对id对象可以调用任何方法,只要它的本体有这个方法就可以,没有的话&amp;#8230;就会产生异常&lt;br /&gt;
看到后面感觉越来越玄乎&amp;#8230;难道一个对象里存了一个方法列表,并且方法名和参数类型都有吗?&amp;#8230;&lt;br /&gt;
事实上就是这样没错&amp;#8230;一个对象指针所指的是个这样的结构体(摘自objc.h)&lt;/p&gt;
&lt;pre&gt;typedef struct objc_object {
  struct objc_class*  class_pointer;
} *id;&lt;/pre&gt;
&lt;p&gt;实际对象在这个基础上后面还会跟上它的成员变量&amp;#8230;&lt;br /&gt;
而这个objc_class呢,则是这样的结构(摘自objc.h)&lt;/p&gt;
&lt;pre&gt;struct objc_class {
  MetaClass           class_pointer;          /* Pointer to the class's
                                                meta class. */
  struct objc_class*  super_class;            /* Pointer to the super
                                                class. NULL for class
                                                Object. */
  const char*         name;                   /* Name of the class. */
  long                version;                /* Unknown. */
  unsigned long       info;                   /* Bit mask.  See class masks
                                                defined above. */
  long                instance_size;          /* Size in bytes of the class.
                                                The sum of the class
						definition and all super
						class definitions. */
  struct objc_ivar_list* ivars;               /* Pointer to a structure that
                                                describes the instance
                                                variables in the class
                                                definition.  NULL indicates
                                                no instance variables.  Does
                                                not include super class
                                                variables. */
  &lt;strong&gt;struct objc_method_list*  methods;&lt;/strong&gt;          /* Linked list of instance
                                                methods defined for the
                                                class. */
  struct sarray *    dtable;                  /* Pointer to instance
					         method dispatch table. */
  struct objc_class* subclass_list;           /* Subclasses */
  struct objc_class* sibling_class;

  struct objc_protocol_list *protocols;	      /* Protocols conformed to */
  void* gc_object_type;
};&lt;/pre&gt;
&lt;p&gt;其中值得注意的是objc_method_list,里面果然存在一个方法列表,只要在列表里查询匹配的方法就可以了,找不到还能在父类中找&lt;br /&gt;
再稍微深入一下,看看这个objc_method_list是什么东西(摘自objc-api.h)&lt;/p&gt;
&lt;pre&gt;typedef struct objc_method_list {
  struct objc_method_list*  method_next;    /* This variable is used to link
                                               a method list to another.  It
                                               is a singly linked list. */
  int            method_count;              /* Number of methods defined in
                                               this structure. */
  Method method_list[1];                    /* Variable length
                                               structure. */
} MethodList, *MethodList_t;&lt;/pre&gt;
&lt;p&gt;这是一个&amp;#8230;链表&amp;#8230;而且似乎是块状链表?&lt;br /&gt;
继续,找到Method的定义是(摘自objc-api.h)&lt;/p&gt;
&lt;pre&gt;typedef struct objc_method {
  SEL         method_name;                  /* This variable is the method's
                                               name.  It is a char*.
                                               The unique integer passed to
                                               objc_msg_send is a char* too.
                                               It is compared against
                                               method_name using strcmp. */
  const char* method_types;                 /* Description of the method's
                                               parameter list.  Useful for
                                               debuggers. */
  IMP         method_imp;                   /* Address of the method in the
                                               executable. */
} Method, *Method_t;&lt;/pre&gt;
&lt;p&gt;可以看到,一个方法包含一个SEL,一个参数表,一个IMP&lt;br /&gt;
SEL就是用@selector()可以得到的东西,上面虽然说包含方法名,但是我实际测试下来似乎不是这样&amp;#8230;?版本不同吗?&lt;br /&gt;
IMP是真正可执行的函数的地址&lt;/p&gt;
&lt;p&gt;于是像什么respondsToSelector:(判断一个对象有没有某个方法),performSelector:(执行某个方法),poseAsClass:(一个类完全由其某个子类扮演),这种神奇的函数也就不那么神秘了&amp;#8230;&lt;/p&gt;
&lt;p&gt;在objective-c中,类自身也是运行时存在的一个对象,想获取这个类的信息(比如类名)或修改这个类,应该是可以做到的&lt;br /&gt;
要新建一个类的实例,需要用类的alloc方法&lt;br /&gt;
也就是说,与其说是类,不如说是一个工厂对象&amp;#8230;生产实例,以及记录这个实例所支持的方法列表之类的信息&lt;/p&gt;
&lt;p&gt;做了个实验,建了个不继承其他类的类BObject,继承自BObject的类Rectangle&lt;br /&gt;
建了BObject,Rectangle,NSObject的实例,然后查看它们的指针以及meta类和父类的指针,画了下面的图&lt;br /&gt;
&lt;a href=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2010/08/objc-relation.png&quot;&gt;&lt;img class=&quot;alignnone size-medium wp-image-32440&quot; title=&quot;objc-relation&quot; src=&quot;http://www.ben1222.com/wordpress/wp-content/uploads/2010/08/objc-relation.png&quot; alt=&quot;指针关系图&quot; width=&quot;832&quot; height=&quot;609&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
从方法列表的方法数来看,似乎左侧的只包含了&amp;#8221;-&amp;#8221;方法,其meta类包含了&amp;#8221;+&amp;#8221;方法&lt;br /&gt;
上面实验是在ubuntu下的GNUStep环境中做的&amp;#8230;&lt;/p&gt;
&lt;p&gt;稍微研究下机理,可以帮助了解很多本来不怎么好理解的特性,函数,用法,等&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.mulle-kybernetik.com/artikel/Optimization/opti-2.html&quot;&gt;这里还有几篇较深入的文章&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/507215666/AC_ben1222/feedsky/s.gif?r=http://www.ben1222.com/wordpress/archives/32439&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/AC_ben1222/507215666/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/AC_ben1222/507215666/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.ben1222.com/wordpress/archives/32439/feed</wfw:commentRss><slash:comments>2</slash:comments><description>最近在看Objective-c
虽说是c语言扩展出来的&amp;#8230;可是这里面的对象甚至类本身却是动态的&amp;#8230;
查了下貌似这叫反射?
倒是和不少脚本型的语言很像&amp;#8230;
了解下语法之类的可以看看这里(这篇东西同时有中文版),Wiki上还有些和C++的对比
一点点看下来,一开始还没什么,感觉只是语法变了下
嗯&amp;#8230;#include变成#import
创建类用@interface,还可以继承,不过只能继承一个父类
objective-c的方法名很有特点&amp;#8230;并不是完整名称后面跟参数列表&amp;#8230;而是两者交织起来&amp;#8230;
虽然这样打字可能要多些(没有带提示功能的编辑器的话,很吃力&amp;#8230;),但是阅读起来更加明晰,不会出现忘记第几个参数是什么作用的情况了
实现类在@implementation块内写
这里就有些舒服了,方法名直接复制到对应的implementation块中就可以开始写方法的内容了
用C++的时候,要把成员函数的声明复制过来,然后在返回类型和函数名之间加上&amp;#8221;类名::&amp;#8221;的东西,感觉很麻烦呢&amp;#8230;
this变成了self,要调用父类的方法而自身却重载过了这个方法时,可以对super调用方法
用-的是对象的method,用+的是类的method,后者相当于C++的静态成员函数
id类型是万能的对象,就像void*,对id对象可以调用任何方法,只要它的本体有这个方法就可以,没有的话&amp;#8230;就会产生异常
看到后面感觉越来越玄乎&amp;#8230;难道一个对象里存了一个方法列表,并且方法名和参数类型都有吗?&amp;#8230;
事实上就是这样没错&amp;#8230;一个对象指针所指的是个这样的结构体(摘自objc.h)
typedef struct objc_object {
  struct objc_class*  class_pointer;
} *id;
实际对象在这个基础上后面还会跟上它的成员变量&amp;#8230;
而这个objc_class呢,则是这样的结构(摘自objc.h)
struct objc_class {
  MetaClass           class_pointer;          /* Pointer to the class's
                 [...]&lt;img src=&quot;http://www1.feedsky.com/t1/507215666/AC_ben1222/feedsky/s.gif?r=http://www.ben1222.com/wordpress/archives/32439&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/AC_ben1222/507215666/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/AC_ben1222/507215666/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description><category>code</category><category>心血来潮</category><category>objective-c</category><category>图片</category><pubDate>Fri, 13 Aug 2010 23:03:48 +0800</pubDate><author>ben1222</author><comments>http://www.ben1222.com/wordpress/archives/32439#comments</comments><guid isPermaLink="false">http://www.ben1222.com/wordpress/?p=32439</guid><dc:creator>ben1222</dc:creator><fs:srclink>http://www.ben1222.com/wordpress/archives/32439</fs:srclink><fs:srcfeed>http://www.ben1222.com/wordpress/feed</fs:srcfeed><fs:itemid>feedsky/AC_ben1222/~8105908/507215666/5755039</fs:itemid></item><item><title>pe vol28 136~140</title><link>http://www.ben1222.com/wordpress/archives/32436</link><content:encoded>&lt;p&gt;原来project euler也是会&lt;a href=&quot;http://projecteuler.net/index.php?section=news&amp;#038;show=archives#26&quot;&gt;放假&lt;/a&gt;的&amp;#8230;出到299题后停2个月&amp;#8230;说会有新的等级出现&amp;#8230;&lt;br /&gt;
&lt;!--这两天发现博客访问量有较明显的上升...查了一下发现在水木社区上有人贴了链接...&lt;/p&gt;
&lt;p&gt;http://www.newsmth.net/bbstcon.php?board=FuncProgram&amp;#038;gid=19951&amp;#038;start=19951&amp;#038;pno=2&lt;/p&gt;
&lt;p&gt;广告真是短期提高知名度的上佳方式啊...我们学校oj也是...--&gt;&lt;br /&gt;
还是慢慢啃老题吧&amp;#8230;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://projecteuler.net/index.php?section=problems&amp;amp;page=3&quot;&gt;Project Euler&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Problem 136 : C++,类似&lt;a href=&quot;/wordpress/archives/32400#pe_problem_135&quot;&gt;Problem 135&lt;/a&gt;&lt;br /&gt;
Problem 137 : C++,att,考察菲波那契数列为系数的无穷级数收敛到正整数的情况,小数字搜到大数字&amp;#8230;&lt;br /&gt;
Problem 138 : C++,att,考察边是整数的等腰三角形高与底边大小相差1的情况,还是小数字搜到大数字&amp;#8230;&lt;br /&gt;
Problem 139 : C++,直角三角形拼正方形,观察一下实际上所需满足的条件,然后枚举本源勾股数处理一下就行了&amp;#8230;&lt;br /&gt;
Problem 140 : C++,类似Problem 137,使用广义菲波那契数列,小数字找规律得到递推式&amp;#8230;&lt;/p&gt;
&lt;p&gt;下面是详细内容:&lt;br /&gt;
&lt;span id=&quot;more-32436&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a name=&quot;pe_problem_136&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;pe_solution&quot;&gt;Problem 136&lt;br /&gt;
&lt;a style=&quot;text-decoration: none;&quot; title=&quot;Click to view problem&quot; href=&quot;http://projecteuler.net/index.php?section=problems&amp;amp;id=136&quot;&gt;Discover when the equation x&lt;sup&gt;2&lt;/sup&gt; − y&lt;sup&gt;2&lt;/sup&gt; − z&lt;sup&gt;2&lt;/sup&gt; = n has a unique solution.&lt;/a&gt;&lt;br /&gt;
正整数x,y,z是等差数列,对给定的正整数n,判断x^2-y^2-z^2=n是否只有唯一解&lt;br /&gt;
求n&lt;50,000,000中上式只有唯一解的n的个数&lt;/p&gt;
&lt;p&gt;和&lt;a href=&quot;/wordpress/archives/32400#pe_problem_135&quot;&gt;Problem 135&lt;/a&gt;很像啊&amp;#8230;&lt;br /&gt;
用相同的方法试试&amp;#8230;&lt;br /&gt;
只不过从求f(n)=10的个数变成了f(n)=1的个数&lt;br /&gt;
6秒出结果&amp;#8230;
&lt;/div&gt;
&lt;p&gt;&lt;a name=&quot;pe_problem_137&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;pe_solution&quot;&gt;Problem 137&lt;br /&gt;
&lt;a style=&quot;text-decoration: none;&quot; title=&quot;Click to view problem&quot; href=&quot;http://projecteuler.net/index.php?section=problems&amp;amp;id=137&quot;&gt;Determining the value of infinite polynomial series for which the coefficients are Fibonacci numbers.&lt;/a&gt;&lt;br /&gt;
无穷级数AF(x)=x*F1+x&lt;sup&gt;2&lt;/sup&gt;*F2+x&lt;sup&gt;3&lt;/sup&gt;*F3+&amp;#8230;&lt;br /&gt;
其中Fk是第k个菲波那契数,F1=1,F2=1&lt;br /&gt;
求使AF(x)为正整数的第15个有理数x所对应的AF(x)的值&lt;/p&gt;
&lt;p&gt;先看看级数收敛成什么样吧&amp;#8230;&lt;/p&gt;
&lt;pre&gt;AF(x)/x - AF(x) = F1+x*(F2-F1)+x&lt;sup&gt;2&lt;/sup&gt;*(F3-F2)+...
                = F1+x*F0+x&lt;sup&gt;2&lt;/sup&gt;*F1+x&lt;sup&gt;3&lt;/sup&gt;*F2+...
因为F1=1,F0=0
AF(x)/x - AF(x) - 1 = x&lt;sup&gt;2&lt;/sup&gt;*F1+x&lt;sup&gt;3&lt;/sup&gt;*F2+...
                    = x*AF(x)
AF(x)*(1/x-1-x)=1
AF(x)=1/(1/x-1-x)=x/(1-x-x&lt;sup&gt;2&lt;/sup&gt;)&lt;/pre&gt;
&lt;p&gt;原来是这么一个式子&amp;#8230;&lt;br /&gt;
那么现在需要x是有理数,AF(x)是正整数&amp;#8230;&lt;/p&gt;
&lt;pre&gt;设AF(x)=y
y*(1-x-x&lt;sup&gt;2&lt;/sup&gt;)=x
x&lt;sup&gt;2&lt;/sup&gt;*y+x(y+1)-y=0
x=(-(y+1)+sqrt((y+1)&lt;sup&gt;2&lt;/sup&gt;+4*y*y))/(2*y)&lt;/pre&gt;
&lt;p&gt;使x为有理数就必须让根号内的数是完全平方数&lt;br /&gt;
(y+1)&lt;sup&gt;2&lt;/sup&gt;+4*y*y=(y+1)&lt;sup&gt;2&lt;/sup&gt;+(2*y)&lt;sup&gt;2&lt;/sup&gt;&lt;br /&gt;
啊&amp;#8230;好像勾股数耶&amp;#8230;&lt;br /&gt;
不过按本源勾股数来的话结果漏掉一些有效解&amp;#8230;而且数字太大&amp;#8230;吃不消&amp;#8230;&lt;/p&gt;
&lt;p&gt;于是换个方法,先枚举测试较小值看看有什么方法&amp;#8230;&lt;/p&gt;
&lt;pre&gt;1:2
2:15
3:104
4:714
5:4895
6:33552
7:229970
8:1576239
9:10803704
10:74049690&lt;/pre&gt;
&lt;p&gt;拿去att搜索一下发现有个叫做&lt;a href=&quot;http://www.research.att.com/~njas/sequences/A001654&quot;&gt;golden rectangle&lt;/a&gt;的东西&amp;#8230;&lt;br /&gt;
啊&amp;#8230;难道就是这个数列的偶数项吗&amp;#8230;?&lt;br /&gt;
这种数的公式是:F(n)*F(n+1)&lt;/p&gt;
&lt;p&gt;然后又发现了&lt;a href=&quot;http://www.research.att.com/~njas/sequences/A081018&quot;&gt;这个数列&lt;/a&gt;&lt;br /&gt;
答案居然直接在上面&amp;#8230;
&lt;/div&gt;
&lt;p&gt;&lt;a name=&quot;pe_problem_138&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;pe_solution&quot;&gt;Problem 138&lt;br /&gt;
&lt;a style=&quot;text-decoration: none;&quot; title=&quot;Click to view problem&quot; href=&quot;http://projecteuler.net/index.php?section=problems&amp;amp;id=138&quot;&gt;Investigating isosceles triangle for which the height and base length differ by one.&lt;/a&gt;&lt;br /&gt;
等腰三角形,底边为b,腰为L,高为h&lt;br /&gt;
求最小的12个等腰三角形的L的和,满足h=b土1&lt;br /&gt;
其中b,L,h为正整数&lt;/p&gt;
&lt;p&gt;总之先搞来勾股数然后一一判断看看&amp;#8230;&lt;br /&gt;
两直角边如果满足一边与另一边的两倍的差是1的话就行了&lt;br /&gt;
似乎底边,也就是b,必须是偶数?&lt;/p&gt;
&lt;p&gt;发现这数的增长速度真快&amp;#8230;&lt;br /&gt;
拿L的前几项去att搜了一下&amp;#8230;发现是&lt;a href=&quot;http://www.research.att.com/~njas/sequences/A007805&quot;&gt;这个数列&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;理由呢?&lt;br /&gt;
好像这种数有个特性&amp;#8230;5*L&lt;sup&gt;2&lt;/sup&gt;-1是完全平方数&amp;#8230;&lt;br /&gt;
验证下是不是满足题目中的三角形&amp;#8230;&lt;/p&gt;
&lt;pre&gt;设a=b/2
那么由等腰三角形的性质可得:
L&lt;sup&gt;2&lt;/sup&gt;=a&lt;sup&gt;2&lt;/sup&gt;+(2*a土1)&lt;sup&gt;2&lt;/sup&gt;
=5*a&lt;sup&gt;2&lt;/sup&gt;土4*a+1
5*L&lt;sup&gt;2&lt;/sup&gt;-1=25*a&lt;sup&gt;2&lt;/sup&gt;土20*a+4=(5*a土2)&lt;sup&gt;2&lt;/sup&gt;&lt;/pre&gt;
&lt;p&gt;啊&amp;#8230;果然如此&amp;#8230;
&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;&lt;a name=&quot;pe_problem_139&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;pe_solution&quot;&gt;Problem 139&lt;br /&gt;
&lt;a style=&quot;text-decoration: none;&quot; title=&quot;Click to view problem&quot; href=&quot;http://projecteuler.net/index.php?section=problems&amp;amp;id=139&quot;&gt;Finding Pythagorean triangles which allow the square on the hypotenuse to be tiled.&lt;/a&gt;&lt;br /&gt;
用四个直角三角形拼成一个正方形,外加中间一个正方形的洞&lt;br /&gt;
用中间的洞的大小的小正方形能填充大正方形的区域的话,就算成功&lt;br /&gt;
问周长在100,000,000以内的直角三角形有几个能成功&lt;/p&gt;
&lt;p&gt;(a,b,c)用c边拼大正方形,中间的洞的正方形边长是(b-a)&lt;br /&gt;
只要c能被(b-a)整除就能成功&lt;br /&gt;
生成勾股数然后判断就行了&lt;br /&gt;
只要注意到本源勾股数能成功的话,它的任何倍数都会成功&lt;br /&gt;
而本源勾股数不能成功的话,它的任何倍数都不会成功
&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;&lt;a name=&quot;pe_problem_140&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;pe_solution&quot;&gt;Problem 140&lt;br /&gt;
&lt;a style=&quot;text-decoration: none;&quot; title=&quot;Click to view problem&quot; href=&quot;http://projecteuler.net/index.php?section=problems&amp;amp;id=140&quot;&gt;Investigating the value of infinite polynomial series for which the coefficients are a linear second order recurrence relation.&lt;/a&gt;&lt;br /&gt;
类似&lt;a href=&quot;#pe_problem_137&quot;&gt;Problem 137&lt;/a&gt;&lt;br /&gt;
无穷级数AG(x)=x*G1+x&lt;sup&gt;2&lt;/sup&gt;*G2+x&lt;sup&gt;3&lt;/sup&gt;*G3+&amp;#8230;&lt;br /&gt;
其中Gk是一个广义菲波那契数列的第k个数,G1=1,G2=4&lt;br /&gt;
求使AG(x)为正整数的前30个有理数x所对应的AG(x)的值的和&lt;/p&gt;
&lt;p&gt;老规矩&amp;#8230;看看级数如何收敛&lt;/p&gt;
&lt;pre&gt;AG(x)/x - AG(x) = G1+x*(G2-G1)+x&lt;sup&gt;2&lt;/sup&gt;*(G3-G2)+...
                = G1+x*G0+x&lt;sup&gt;2&lt;/sup&gt;*G1+x&lt;sup&gt;3&lt;/sup&gt;*G2+...
因为G1=1,G0=3
AG(x)/x - AG(x) - 1 = x*3+x&lt;sup&gt;2&lt;/sup&gt;*G1+x&lt;sup&gt;3&lt;/sup&gt;*G2+...
                    = x*3+x*AG(x)
AG(x)*(1/x-1-x)=1+x*3
AG(x)=(1+x*3)/(1/x-1-x)=(x+3*x&lt;sup&gt;2&lt;/sup&gt;)/(1-x-x&lt;sup&gt;2&lt;/sup&gt;)&lt;/pre&gt;
&lt;p&gt;那么现在需要x是有理数,AG(x)是正整数&amp;#8230;&lt;/p&gt;
&lt;pre&gt;令AG(x)=y
y*(1-x-x&lt;sup&gt;2&lt;/sup&gt;)=x+3*x&lt;sup&gt;2&lt;/sup&gt;
x&lt;sup&gt;2&lt;/sup&gt;*(3+y)+x*(1+y)-y=0
x=(-(1+y)+sqrt((1+y)&lt;sup&gt;2&lt;/sup&gt;+4*y*(3+y)))/(2*(3+y))
根号内要是完全平方数
(1+y)&lt;sup&gt;2&lt;/sup&gt;+4*y*(3+y)=1+2*y+y&lt;sup&gt;2&lt;/sup&gt;+12*y+4*y&lt;sup&gt;2&lt;/sup&gt;
                 =5*y&lt;sup&gt;2&lt;/sup&gt;+14*y+1&lt;/pre&gt;
&lt;p&gt;枚举测试较小数的话&amp;#8230;&lt;/p&gt;
&lt;pre&gt;1:2
2:5
3:21
4:42
5:152
6:296
7:1050
8:2037
9:7205
10:13970
11:49392
12:95760
13:338546
14:656357
15:2320437&lt;/pre&gt;
&lt;p&gt;这回在att上搜不到了,但是因为&lt;a href=&quot;#pe_problem_137&quot;&gt;Problem 137&lt;/a&gt;最后是菲波那契数列相乘的形式,所以这回试着对这些数做做差找找规律&lt;br /&gt;
结果很快就发现了这样的规律&lt;br /&gt;
y3=y2+G5+F3&lt;br /&gt;
y4=y3+G6-F3&lt;br /&gt;
y5=y4+G9+F7&lt;br /&gt;
y6=y5+G10-F7&lt;br /&gt;
y7=y6+G13+F11&lt;br /&gt;
y8=y7+G14-F11&lt;br /&gt;
..&lt;br /&gt;
其中Fk是第k个菲波那契数,F1=1,F2=1&lt;/p&gt;
&lt;p&gt;剩下的就是递推了,答案正确
&lt;/p&gt;&lt;/div&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/507215667/AC_ben1222/feedsky/s.gif?r=http://www.ben1222.com/wordpress/archives/32436&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/AC_ben1222/507215667/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/AC_ben1222/507215667/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.ben1222.com/wordpress/archives/32436/feed</wfw:commentRss><slash:comments>0</slash:comments><description>原来project euler也是会放假的&amp;#8230;出到299题后停2个月&amp;#8230;说会有新的等级出现&amp;#8230;

还是慢慢啃老题吧&amp;#8230;
Project Euler
Problem 136 : C++,类似Problem 135
Problem 137 : C++,att,考察菲波那契数列为系数的无穷级数收敛到正整数的情况,小数字搜到大数字&amp;#8230;
Problem 138 : C++,att,考察边是整数的等腰三角形高与底边大小相差1的情况,还是小数字搜到大数字&amp;#8230;
Problem 139 : C++,直角三角形拼正方形,观察一下实际上所需满足的条件,然后枚举本源勾股数处理一下就行了&amp;#8230;
Problem 140 : C++,类似Problem 137,使用广义菲波那契数列,小数字找规律得到递推式&amp;#8230;
下面是详细内容:


Problem 136
Discover when the equation x2 − y2 − z2 = n has a unique solution.
正整数x,y,z是等差数列,对给定的正整数n,判断x^2-y^2-z^2=n是否只有唯一解
求n&lt;img src=&quot;http://www1.feedsky.com/t1/507215667/AC_ben1222/feedsky/s.gif?r=http://www.ben1222.com/wordpress/archives/32436&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/AC_ben1222/507215667/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/AC_ben1222/507215667/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description><category>猜想</category><category>Project Euler</category><category>三角形</category><category>勾股数</category><category>无穷级数</category><category>枚举</category><category>数学</category><category>volume</category><pubDate>Tue, 03 Aug 2010 22:14:51 +0800</pubDate><author>ben1222</author><comments>http://www.ben1222.com/wordpress/archives/32436#comments</comments><guid isPermaLink="false">http://www.ben1222.com/wordpress/?p=32436</guid><dc:creator>ben1222</dc:creator><fs:srclink>http://www.ben1222.com/wordpress/archives/32436</fs:srclink><fs:srcfeed>http://www.ben1222.com/wordpress/feed</fs:srcfeed><fs:itemid>feedsky/AC_ben1222/~8105908/507215667/5755039</fs:itemid></item></channel></rss>
