借用点其它的东西,你或许可以三等分角

    大家都知道,我们永远不可能尺规三等分任意角。借助一些其它的工具是可以办到的,即使所借助的东西“微不足道”,“几乎可以不算”。下面提供四种比较简单的方法。

ONE~~~~~~~~~
    至今仍有不少人认为这种方法可以推翻“三等分角不可能”的结论。而事实上,这种方法仍然算借用了外物。
    尺规不能三等分角,但可以三等分圆(自己试)。也就是说,只用直尺和圆规可以画出120度的角来。现在给你一个任意角,那么你可以把它对应的扇形卷成一个圆锥,三等分这个圆锥底面的圆。还原成扇形后,你会看到这个角所对应的圆弧已经被平分为三份了。

TWO~~~~~~~~~
      
    把要三等分的角AOB放在圆中,作为圆心角。从B出发作射线交圆于D,交AO延长线于C,当CD等于圆的半径时角ACB就是角AOB的1/3。你可以试着自己证明一下。
    证明:设∠DCO=x。由CD=DO知∠DCO=∠DOC,于是∠DOC=x,进而∠BDO=2x。由DO=BO知∠BDO=∠DBO,于是∠DBO=2x,进而∠AOB=∠ACB+∠DBO=3x
    结论是正确的,可惜如果不在尺子上作标记的话图是作不出来的。

THREE~~~~~~~
      
    我们要三等分角BAC。作CD垂直于AB,垂足为D。作CE平行于AB。AE交CD于F。适当移动E的位置(仍然保持CE//AB),当EF=2AC时,∠EAB=1/3∠CAB。
    证明很简单:找出EF的中点后,于是EM=FM=CM=AC,那么∠CAM=∠CMA=2∠AEC,又因为CE//AB,所以最终可得∠CAE=2∠EAB,也即∠EAB=1/3∠CAB。和方法二一样,尺子上面没有刻度的话是作不出这个图的。

FOUR~~~~~~~~
      
    如果你手上有一张纸的话,你可以用折纸的方法三等分角。
    把角XAY(蓝色标明)放在纸的一个直角上,AY靠着纸的边缘。在纸的另一直角边上确定两点P和Q使得AP=PQ,过这两个点分别作平行于AY的直线。现在,把纸折起来,让Q点落在AX上,A点落在过P的那条平行线上,那么A和P的落点就确定了三等分线的位置(红色线段)。怎么证明呢?
    证明:为了便于叙述,我们把A、P、Q的落点分别命名为A'、P'、Q',折痕的端点分别为B和C。过A'作A'D垂直于AY。∠AA'D = 90°- ∠A'AD = ∠BAA'。又AB=A'B,于是∠BAA'=∠BA'A。加上A'D=PA=P'A',AA'是公共边,足以说明△AA'P'≌△AA'D (SAS)。这样,∠AP'A'和∠AP'Q'都是直角。又注意到AP=PQ即A'P'=P'Q',于是△AP'A'≌△AP'Q'。以A为顶点的三个直角三角形全等,也即对应的三个角相等。

做人要厚道
转贴请注明出处

又一种证明根号2是无理数的方法

    今天的最后一篇日志了,仍然是翻译的cut-the-knot。发完我就睡觉去了。

    这里已经有五种证明根号2是无理数的方法了。现在我们算是介绍第六种方法了。
    一个有限小数的平方绝对不可能变成整数,因为小数部分不可能消失。观察有限小数的小数部分最后一个数字你会发现结论是显然的,平方后它总会产生新的“最后一位”。
    下面证明,(n/m)^2不可能等于2。n/m不可能是整数,于是把它写成小数形式,而有限小数的平方不可能是整数。如果n/m不是有限小数的话,可以把它转换成另外的进制使得n/m是有限小数,因而上面的结论仍然成立。一个进制下的无限小数可能是另一个进制下的有限小数。比如,把分数n/m转化为m进制,得到的小数肯定是有限小数。

趣题:阿米巴的生存

    在每一代的繁殖中,单个的阿米巴原虫有3/4的概率分裂成两个,有1/4的概率死亡(而不产生下一代)。初始时只有一个阿米巴原虫,求阿米巴原虫会无限繁殖下去的概率。
    答案在下面。

    解答:令p为单个阿米巴原虫分裂的概率(题目中等于3/4),令P为我们要求的概率(无限繁殖的概率)。
    初始时的那个阿米巴原虫有p的概率分裂为两个,至少有一个可以无限生存下去的概率为1-(1-P)^2。那么,我们得到式子:
      P = p*( 1 – (1-P)^2 )

    化简后得到:
      p*P^2 + (1 – 2p)P = 0

    或者写成:
      P * ( pP + ( 1-2p ) ) = 0

    由于P≠0,因此pP+(1-2p) = 0,即P = (2p-1)/p

    可以看到,如果一个阿米巴原虫分裂的概率没超过1/2,那么它不可能永远生存下去无限生存下去的概率为0。在我们的题目中,p=3/4,因此阿米巴原虫无限繁殖的概率为2/3。

趣题:哪条线段最长,哪条线段最短

    最近cut-the-knot上的一些新东西比较有意思。今天下午没事干,我翻译一些我觉得好玩的和大家分享。
    上图显示了用直线将一个四分之一圆分为面积相等的两份的三种方法。这三条线段中,哪一个最长,哪一个最短?
    答案在下面。

    第一种方案的线段长度等于圆的半径;
    第二种方案的线段长度显然大于半径,因为红色线段和半径长度相等,但它还不足以平分扇形面积。
    第三种方案的线段长度显然小于半径。

因此,线段长度为②>①>③。

Matrix67生日邀请赛 完全题解发布

题目在这里:http://www.matrix67.com/blog/article.asp?id=241

如果机房马上要关门了,或者你急着要和MM约会,请看简要题解:

1. 用类似于传统hanoi的递归方法可以做到3^n-1次。这显然是最多的了,因为总的状态数也只有3^n个。
2. 可以证明,竞赛图中不存在环当且仅当所有顶点的出度从小到大排列依次为0, 1, 2, … , n-1 。
3. 在最短路树上做树状DP,需要多叉转二叉。注意几种需要输出0的情况。
4. 搜索,算是练基本功了。用位运算优化,不加任何剪枝就能过。

否则,请慢慢阅读——

Problem 1: 为什么最少
    如果你还不熟悉Hanoi塔的解法,去题目中提到的那篇日志看看吧。如果你已经熟悉Hanoi塔的解法,你会立刻想到这道题的解法:依然是递归地解决。至于怎么递归,样例已经告诉我们了:把前n-1个金片从1号柱搬到3号柱,把第n片移到2号柱,又把那n-1片从3号柱搬回1号柱,再把第n片搬到3号柱,最后把那n-1个金片又搬过来,完成整个操作。
    我们下面解决三个问题:为什么这样不会重复出现状态,这样的移动步数是多少,为什么这样的操作步数是最多的。
    为什么这样不会出现重复的状态呢?因为我们假设前n-1个金片的移动过程中没有重复状态,而三次对n-1的调用时整个状态由于第n个金片的位置不同而不同。
    这样的方法获得的操作步数是多少呢?答案是3^n-1。我们可以用数学归纳法证明,n=1时步数为2显然正确,而f(n+1)=3f(n)+2=3*(3^n-1)+2=3^(n+1)-1。
    为什么这样的操作步数是最多的呢?废话,这样的操作步数当然是最多的,因为总的状态数也只有3^n个(每个金片的三种可能的位置确定了一种状态),你的移动步骤能比这个数目还多就见鬼了。

    这道题有人用了math库,没有提供math库导致无法编译是我的失误,向大家道歉。

    Hanoi问题的变种太多了,比如多根柱子、单向移动、双色金片等等。dd上次不是也出了一题么。

    这题代码很短,我公布在下面。
program whyleast;

procedure solve(t,a,b:integer);
begin
   if t=0 then exit else
   begin
      solve(t-1,a,b);
      writeln(a,' ',2);
      solve(t-1,b,a);
      writeln(2,' ',b);
      solve(t-1,a,b);
   end;
end;

{====main====}
var
   n,i:integer;
   ans:longint=1;
begin
   assign(input,'whyleast.in');
   reset(input);
   assign(output,'whyleast.out');
   rewrite(output);
  
   readln(n);
   for i:=1 to n do ans:=ans*3;
   writeln(ans-1);
   solve(n,1,3);
  
   close(input);
   close(output);
end.

Problem 2: 身高控制计划
    一个竞赛图是指任两个点之间都有一条有向边的图。竞赛图有很多奇妙的性质,比如一个竞赛图必然存在一条经过所有节点的路等等。
    下面我们证明,竞赛图中不存在环当且仅当所有顶点的出度从小到大排列依次为0, 1, 2, … , n-1 :
    如果一个有向图的所有点出度都至少为1,那么这个图一定有环,因为在找到环之前DFS总可以找到新的节点。如果有向图无环,必然存在一个点没有出度。由于任两点之间都有有向边,那么其它所有点都要连一条边指向它,这样其它所有点的出度都至少为1了。删掉这个出度为0的点后剩下的图仍然无环,不断对剩下的图继续上面的过程就得到了我们的结论。
    现在我们的算法就很明确了,首先统计初始状态下的出度,然后设计某种数据结构完成两种操作:改变一个数(加一减一),询问所有数是否恰好为0, 1, 2, … , n-1 。
    统计初始状态下的出度方法有很多,这里介绍两个。首先对身高排序,然后对于每个人进行二分,寻找有序数列中该数的4/5和5/4各在什么地方。还有一种方法也是先排序,然后从左到右扫描整个序列,并保持两个指针始终指向4/5和5/4处。每次开始处理一个新的数时都把两个指针适当地右移直到超出了这个数的4/5或5/4为止。两种方法都是O(nlogn)。别以为第二种方法是线性的哦,线性算法之前还有一个排序呢。
    操作的处理也有不少方法。最简单的方法就是统计当前图中出度的数目有多少种。就是说,用a[i]表示出度为i的点有多少个,然后不断更新a[i]>0的有多少个。当这个数目等于n时我们就认为图中没有环(因为出度可能的取值只有从0到n-1共n种)。
    注意,由于同一条边可能被操作多次,因此需要一个Hash表(开散列)来判重。具体地说,你需要判断这条边以前被操作过奇数次还是偶数次,以决定哪边的出度要增加,哪边的出度要减小。

Problem 3: 狼的复仇

    把这个问题中所有的最短路都画出来是什么样子?它一定是一棵树!为什么?首先,图肯定是连通的,因为源点到任一个点都有一条最短路;其次,图肯定无环,因为源点到任一个点只有一条最短路(环的出现将意味着某些点有更短的路存在)。仔细想一下Dijkstra的算法过程,不难想到Dijkstra算法的实质就是在建这棵树——每一次由x节点加上边x-y扩展到y节点就记作x是y的父亲。注意观察上图中左图是如何变成右图的。这样,题目变成了这种形式:在有根树上,除根节点之外的其它节点中选择一些节点,使得这些节点和它们所有祖先的权值和最大。这是一个经典的树型动态规划模型。我们用f[i,j]表示以节点i为根节点的子树花费j个单位的材料最多可以得到多大的攻击力。令节点1的材料和攻击力都为0,那么最后输出f[1,0..k]中的最大值即可。决策分为两类,要么该位置建一个塔,要么把所有材料适当地分给儿子(自己就不需要再建了)。但这样的复杂度太高,我们需要用DP嵌套或者更巧妙的多叉转二叉来解决。
    DP嵌套理解起来更简单,它主要是解决这样一个子问题:若某个节点有m个儿子,我们需要寻找当j1+j2+…+jm等于某个定值时f[儿子1,j1]+f[儿子2,j2]+…+f[儿子m,jm]的最大值。这个子问题与我的某次模拟赛中论文课题选择那道DP题几乎是一模一样,看一看那道题就明白了。下面简单描述多叉转二叉的方法。

    如果你还不知道多叉转二叉的话,这道题是一个绝好的学习材料。一棵多叉树可以用“左儿子右兄弟”的方法转为二叉树,具体的说就是把多叉树转化为这种形式:节点的左儿子才是真正的儿子,节点的右儿子只是和它同辈的兄弟。注意看上图的左图是如何变成右图的。现在,我们的f[i,j]表示