DUST

Do the things I want to do

Lucky Sequence[SRM403DIVI500]

1. 将所有Lucky Number按照(4,4),(4,7),(7,4),(7,7)分类,分别计算不重复的数的个数存于矩阵中:
    ---------------
    | (4,4) | (4,7) |
    ---------------      ====>    A
    | (7,4) | (7,7) |
    ---------------
2. 求长度为length的Lucky Sequence的个数。这里应用矩阵乘法即可达到求解的目的。
   (如:(4,4) = (4,4)*(4,4) + (4,7)*(7,4))
   length = 1: return A
   length = 2: return A * A
   ......
   length = n: return A*A*...*A (即A^n)
   
   若length为偶数:
         A*A*A*...*A   => (A*A)*(A*A)*...*(A*A)
                              => (A^2)*(A^2)*...*(A^2)
                              => (A^4)*(A^4)*...*(A^4)
                              => ......
                              => (A^(n/2)) * (A^(n/2))
                              => A^n
   若length为奇数:
         A*A*A*...*A  => A*(A*A*A*...*A) => ...
                             => A*(A^((n-1)/2) * A^((n-1)/2))
   由此可得:

 1private long[,] pow(long[,] a, int k){
 2    if(k == 0{
 3        //单位矩阵
 4        long[,] res = new long[2,2];
 5        res[0,0= 1;
 6        res[1,1= 1;
 7        return res;
 8    }

 9    if(k % 2 == 0{
10        return pow(mul(a,a), k/2);
11    }
 else {
12        return mul(a, pow(a, k-1));
13    }

14}

15// long[,] mul(long[,], long[,]);// 矩阵乘法
    最后将矩阵各个元素累加即是最后结果

用矩阵乘法来求解,code能写的非常漂亮。可惜,“我只猜中了故事开头,却没猜到故事的结局”。

posted on 2008-06-01 13:46  should  阅读(184)  评论(0编辑  收藏  举报

导航