分类: C/C++
2012-05-26 08:42:01
哥德巴赫猜想:
任一大于2的偶数,都可表示成两个素数之和。
是世界上最著名的未解问题之一,但是下面的反哥德巴赫猜想:
任一大于11的奇数,都可表示成两个合数之和。
确很容易证明。
定义反哥德巴赫分拆数g(n)表示将大于11的奇数n分解为两个合数之和的方案数。再定义sg(n)=sum({g(i) | i ≤ n}),即所有不大于n的奇数的反哥德巴赫分拆数之和。你的任务就是快速的计算给定n所对应的sg(n)。
Input
有大约100组测试数据。每组测试数据占一行,包含唯一的一个正整数13 ≤ n ≤ 1000000。输入以EOF结束。
Output
对于输入n,输出对应的sg(n)。
Sample Input
13
14
15
Sample Output
1
1
2
由题目意思可得:
sg[n]=sg[n-2]+g[n]; (1)非常明显可以得到
g[n]=g[n-2]+; (2)//composite[n]表示n是否为素数
解释一下等式(2)。因为g[n-2]是奇数,对于它的任何一个有效分解都是奇数X和偶数Y(Y>=4),X和Y+2(Y+2必然是合数)必然是g[n]的一个有效分解。而(n-4,2)必然不是g[n-2]的分解,但是数对(n-4,4)可能是g[n]的有效分解,所以引入composite[]数组。
很显然,我们首先可以算出数组composite,然后利用式(2)(1)计算出g[]和sg[]