Problem
Total number of odd entries in first n rows of Pascal’s triangle. 
對於巴斯卡三角形找奇數的個數。
Sample Output
Solution
下面是巴斯卡三角形 (組合數) 前 n 行為奇數的總個數。
0, 1, 3, 5, 9, 11, 15, 19, 27, 29, 33, 37, 45, 49, 57, 65, 81, 83, 87, 91, 99, 103, 111, 119, 135, 139, 147, 155, 171, 179, 195, 211, 243, 245, 249, 253, 261, 265, 273, 281, 297, 301, 309, 317, 333, 341, 357, 373, 405, 409, 417, 425, 441, 449, 465, 481, 513, 521
在 A006046 可以得到遞迴公式:
- a(0) = 0
- a(1) = 1
- a(2k) = 3 * a(k),- a(2k+1) = 2*a(k) + a(k+1)
但是在第三項中可以發現到有可能指數增加,由於會被拆分成兩項,所以這方法不太可行。
如果打印每一行的奇數個數出來,四四分組,會發現組合是以 2 的冪次增長的組合,而組合之間恰好是兩倍的關係。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
 | 1 2 2 4  ----------- sum 9 2 4 4 8  ----------- sum 27 -- 2 4 4 8  4 8 8 16 ----------- sum 81 -- prev x 2 2 4 4 8  4 8 8 16  4 8 8 16  8 16 16 32 ----------- sum 273   -- prev x 2 2 4 4 8  4 8 8 16  4 8 8 16  8 16 16 32  4 8 8 16  8 16 16 32 ...
 | 
觀察如上所述,遞推之。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
 | #include <stdio.h>  long long f(long long n) {     if (n < 2)	return n;     if (n&1)          return f(n/2) * 2 + f(n/2 + 1);     else         return f(n/2) * 3; } unsigned long long dp[50] = {}; unsigned long long g(long long n) {     if (n == 0)	return 0;     if (n == 1)	return 1;     if (n == 2)	return 3;     if (n == 3)	return 5;     if (n == 4)	return 9;     if (n == 5)	return 11;     if (n == 6)	return 15;     if (n == 7)	return 19;     long long i, j;     for (i = 1, j = 1; 8 * i < n; i <<= 1, j++);     return dp[j] + 2 * g(n - 4 * i); } int main() {     dp[1] = 9, dp[2] = 27;     for (int i = 3; i < 50; i++)         dp[i] = dp[i - 1] * 3;           long long L, R;     while (scanf("%lld %lld", &L, &R) == 2) {         if (L == 0 && R == 0)             break;         unsigned long long ret2 = g(R + 1) - g(L);         printf("%llu\n", ret2);     }     return 0; }
 |