杭电oj3306:Another kind of Fibonacci(矩阵快速幂)

Another kind of Fibonacci

题目链接

Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)

Problem Description

As we all known , the Fibonacci series : F(0) = 1, F(1) = 1, F(N) = F(N - 1) + F(N - 2) (N >= 2).Now we define another kind of Fibonacci : A(0) = 1 , A(1) = 1 , A(N) = X * A(N - 1) + Y * A(N - 2) (N >= 2).And we want to Calculate S(N) , S(N) = A(0)^2 +A(1)^2+……+A(n)^2.

Input

There are several test cases.
Each test case will contain three integers , N, X , Y .
N : 2<= N <= 2^31 – 1
X : 2<= X <= 2^31 – 1
Y : 2<= Y <= 2^31 – 1

Output

For each test case , output the answer of S(n).If the answer is too big , divide it by 10007 and give me the reminder.

Sample Input

2 1 1
3 2 3

Sample Output

6
196

思路见下图:
杭电oj3306:Another kind of Fibonacci(矩阵快速幂)_第1张图片

#include
#include 
using namespace std;

const int maxn = 5;
typedef long long LL;

struct Matrix{
    int matrix[maxn][maxn];
}ori, ans;

int n = 4, N, X, Y, m = 10007;

void init()
{
    for(int i=0;i 0)
    {
        if(b & 1)
            temp = multiply(ori, temp);
        ori = multiply(ori, ori);
        b >>= 1;
    }
    return temp;
}

int main()
{
    //freopen("in.txt","r", stdin);
    while(cin>>N>>X>>Y)
    {
        X %= m;
        Y %= m;
        init();
        Matrix temp = binaryPow(N - 1);
        ans = multiply(temp, ans);
        cout<

你可能感兴趣的:(杭电oj3306:Another kind of Fibonacci(矩阵快速幂))