HDU - 5950 Recursive sequence (矩陣快速冪)

Recursive sequence

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1705    Accepted Submission(s): 775


Problem Description
Farmer John likes to play mathematics games with his N cows. Recently, they are attracted by recursive sequences. In each turn, the cows would stand in a line, while John writes two positive numbers a and b on a blackboard. And then, the cows would say their identity number one by one. The first cow says the first number a and the second says the second number b. After that, the i-th cow says the sum of twice the (i-2)-th number, the (i-1)-th number, and i4. Now, you need to write a program to calculate the number of the N-th cow in order to check if John’s cows can make it right. 
 

Input
The first line of input contains an integer t, the number of test cases. t test cases follow.
Each case contains only one line with three numbers N, a and b where N,a,b < 231 as described above.
 

Output
For each test case, output the number of the N-th cow. This number might be very large, so you need to output it modulo 2147493647.
 

Sample Input
2 3 1 2 4 1 10
 

Sample Output
85 369
Hint
In the first case, the third number is 85 = 2*1十2十3^4. In the second case, the third number is 93 = 2*1十1*10十3^4 and the fourth number is 369 = 2 * 10 十 93 十 4^4.
 

Source
 

Recommend
jiangzijing2015


題意:給出 F1 , F2 以及遞推式 Fn  = Fn-1 + 2 * Fn-2 + n^4 求第n項,其中 n^4 到 (n+1)^4 的轉移可以用二項式定理展開,展開得到的 n^3 , n^2 同理。
最終的中間矩陣應該是
1 1 0 0 0 0 0
2 0 0 0 0 0 0 
1 0 1 0 0 0 0
0 0 4 1 0 0 0
0 0 6 3 1 0 0
0 0 4 3 2 1 0
0 0 1 1 1 1 1

#include <bits/stdc++.h>
using namespace std;

const long long N = 7, Mod = 2147493647;
int t;
long long f1, f2, n;
struct xx{
    long long a[N][N];
} ori,res;

xx mul(xx x,xx y){
    xx temp;
    memset(temp.a, 0, sizeof(temp.a));
    for(int i = 0; i < N; i++){
        for(int j = 0; j < N; j++){
            for(int k = 0; k < N; k++){
                temp.a[i][j] += x.a[i][k]*y.a[k][j];
                temp.a[i][j] %= Mod;
            }
        }
    }
    return temp;
}

void init(){
    memset(res.a, 0, sizeof(res.a));
    memset(ori.a, 0, sizeof(ori.a));
    ori.a[0][0] = 1, ori.a[1][0] = 2, ori.a[2][0] = 1;
    ori.a[0][1] = 1, ori.a[2][2] = 1, ori.a[3][2] = 4;
    ori.a[4][2] = 6, ori.a[5][2] = 4, ori.a[6][2] = 1;
    ori.a[3][3] = 1, ori.a[4][3] = 3, ori.a[5][3] = 3;
    ori.a[6][3] = 1, ori.a[4][4] = 1, ori.a[5][4] = 2;
    ori.a[6][4] = 1, ori.a[5][5] = 1, ori.a[6][5] = 1, ori.a[6][6] = 1;
    res.a[0][0] = f2, res.a[0][1] = f1, res.a[0][2] = 81;
    res.a[0][3] = 27, res.a[0][4] = 9, res.a[0][5] = 3, res.a[0][6] = 1;
}

long long calc(long long k){
    while(k){
        if(k & 1) res = mul(res, ori);
        ori = mul(ori, ori);
        k >>= 1;
    }
    return res.a[0][0];
}

int main(){
    scanf("%d", &t);
    while(t--){
        scanf("%lld%lld%lld", &n, &f1, &f2);
        if(n == 1){
            printf("%lld\n", f1);
            continue;
        }
        if(n == 2){
            printf("%lld\n", f2);
            continue;
        }
        init();
        printf("%lld\n", calc(n-2));
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章