2011-06-01 22:03:29Morris

d828. Pascal's triangle's secret (II)

http://zerojudge.tw/ShowProblem?problemid=d828

內容 :

帕斯卡三角形 (Pascal's Triangle) 是一個特別的三角數列,已經發現許多的數學性質可以和它有所關連。

定義此三角形的頂端(第 0 列)為1,之後的每一列都比上一列多一個數字,因此第 n 列的總共有 n + 1 個數字,每一列以等腰三角形的形式置中對齊。
除了第 0 列的任一個數字都是左上和右上數字的和,如果這個數字是在這一列的最左或最右側,它的左上及右上將沒有數字,此時我們將沒有數字的地方視為 0 。

綜合以上性質,可以得到以下的三角形,在此只列出到第四列:

第 0 列:    1
第 1 列:   1 1
第 2 列:  1 2 1
第 3 列: 1 3 3 1
第 4 列:1 4 6 4 1

不過本題為了方便敘述起見,我們將帕斯卡三角形稍微變形一下,原本置中對齊變成了靠左對齊,就像這樣:

第 0 列:1
第 1 列:1 1
第 2 列:1 2 1
第 3 列:1 3 3 1
第 4 列:1 4 6 4 1

這次要問你的是,從第 n 列的第一個數字開始往右上角相加,直到沒有數字為止,此時的總和為多少?
(更白話地說,若定義每一列的第一個數字為第 0 項,且三角形外空白部分全部補 0 ,則對於每一個 i (0 <= i <= n) ,將每個第 n - i 列的第 i 項  相加的總和為何?)
答案可能非常大,請 Mod 10000 後輸出。

輸入說明 :

多個整數 n (0 <= n <= 2147483647)。

輸出說明 :

對於每個整數 n ,輸出一個正確解答。

範例輸入 :help

0
1

範例輸出 :

1
1

提示 :

Divide and Conquer

出處 :

(管理:as89366)

作法 : D&C
很明顯的,你可以看出來關係式 an=an-1+an-2
恰好是費氏數列,那麼就可以用矩陣快速運算了

/**********************************************************************************/
/*  Problem: d828 "Pascal's triangle's secret (II)" from                          */
/*  Language: C                                                                   */
/*  Result: AC (216ms, 264KB) on ZeroJudge                                        */
/*  Author: morris1028 at 2011-06-01 21:12:19                                     */
/**********************************************************************************/


#include<stdio.h>
void Mod(int *N) {
    if(*N > 50000) (*N)%=10000;
}
main() {
    int N;
    while(scanf("%d", &N) == 1) {
        if(N < 2)    puts("1");
        else {
            int a=1, b=1, c=1, d=0;
            int A=1, B=0, C=0, D=1, t1, t2, t3, t4;

            while(N) {
                if(N&1) {
                    t1 = A*a + B*c;
                    t2 = A*b + B*d;
                    t3 = C*a + D*c;
                    t4 = C*b + D*d;
                    A = t1, B = t2, C = t3, D = t4;
                    Mod(&A), Mod(&B), Mod(&C), Mod(&D);
                }
                N /= 2;
                t1 = a*a + b*c;
                t2 = a*b + b*d;
                t3 = a*c + c*d;
                t4 = b*c + d*d;
                a = t1, b = t2, c = t3, d = t4;
                Mod(&a), Mod(&b), Mod(&c), Mod(&d);
            }
            printf("%d\n", A%10000);
        }
    }
    return 0;
}
/*a b
  c d*/

上一篇:d624. 燈泡問題

下一篇:d681. BinaryCount