Another kind of Fibonacci(矩阵)

Another kind of Fibonacci

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1919    Accepted Submission(s): 738

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 <= 231 – 1
X : 2<= X <= 231– 1
Y : 2<= Y <= 231 – 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

题意:很明确了。。。不多说。

思路:

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3306

转载请注明出处:寻找&星空の孩子

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
#define LL __int64
#define mod 10007

struct matrix
{
    LL mat[4][4];
};

matrix multiply(matrix a,matrix b)
{
    matrix c;
    memset(c.mat,0,sizeof(c.mat));
    for(int i=0;i<4;i++)
    {
        for(int j=0;j<4;j++)
        {
            if(a.mat[i][j]==0)continue;
            for(int k=0;k<4;k++)
            {
                if(b.mat[j][k]==0)continue;
                c.mat[i][k]=(c.mat[i][k]+a.mat[i][j]*b.mat[j][k])%mod;
            }
        }
    }
    return c;
}

matrix quickmod(matrix a,LL n)
{
    matrix res;
    for(int i=0;i<4;i++)
        for(int j=0;j<4;j++)
            res.mat[i][j]=(i==j);
    while(n)
    {
        if(n&1) res=multiply(res,a);
        n>>=1;
        a=multiply(a,a);
    }
    return res;
}

int main()
{
    LL n,x,y;

    while(scanf("%I64d%I64d%I64d",&n,&x,&y)!=EOF)
    {
        if(n==0||n==1)
        {
            printf("%I64d\n",n+1);
            continue;
        }
        matrix ans;
        ans.mat[0][0]=ans.mat[1][2]=1;
        ans.mat[0][1]=ans.mat[0][2]=ans.mat[0][3]=0;
        ans.mat[2][2]=ans.mat[2][3]=ans.mat[3][2]=0;
        ans.mat[1][0]=ans.mat[1][1]=x*x%mod;
        ans.mat[2][0]=ans.mat[2][1]=y*y%mod;
        ans.mat[3][0]=ans.mat[3][1]=2*x*y%mod;
        ans.mat[1][3]=x%mod;
        ans.mat[3][3]=y%mod;

        ans=quickmod(ans,n-1);
        printf("%I64d\n",(2*ans.mat[0][0]+ans.mat[1][0]+ans.mat[2][0]+ans.mat[3][0])%mod);

    }
    return 0;
}

加油!少年!

时间: 2024-11-08 23:04:52

Another kind of Fibonacci(矩阵)的相关文章

poj 3070 Fibonacci (矩阵快速幂求斐波那契数列的第n项)

题意就是用矩阵乘法来求斐波那契数列的第n项的后四位数.如果后四位全为0,则输出0,否则 输出后四位去掉前导0,也...就...是...说...输出Fn%10000. 题目说的如此清楚..我居然还在%和/来找后四位还判断是不是全为0还输出时判断是否为0然后 去掉前导0.o(╯□╰)o 还有矩阵快速幂的幂是0时要特判. P.S:今天下午就想好今天学一下矩阵乘法方面的知识,这题是我的第一道正式接触矩阵乘法的题,欧耶! #include<cstdio> #include<iostream>

hdu 3326 Another kind of Fibonacci (矩阵构造)

题目大意: 描述了另外一种斐波那契 F[n] = x*F[n-1] + y*F[n-2]; 求segma(F[i]^2): 思路分析: 构造矩阵的详细 请戳我 构造矩阵可以得到 中间矩阵为 1 1 0 0 0 x^2      y^2   2*x*y 0 1 0 0 0 x 0 y #include <iostream> #include <cstdio> #include <algorithm> #include <cmath> #include <

hdu 1588(Fibonacci矩阵求和)

题目的大意就是求等差数列对应的Fibonacci数值的和,容易知道Fibonacci对应的矩阵为[1,1,1,0],因为题目中f[0]=0,f[1]=1,所以推出最后结果f[n]=(A^n-1).a,所以 f(g(i))= f(k*i+b)= (A^(k*i+b-1)).a,i从 0取到 n-1,取出公因式 A^(b-1)(因为矩阵满足分配率),然后所求结果可化为 A^(b-1) * (A^0 + A^k + A^2k +....+ A^(n-1)k),化到这里后难点就是求和了,一开始我尝试暴力

POJ 3070 Fibonacci 矩阵快速求法

就是Fibonacci的矩阵算法,不过增加一点就是因为数字很大,所以需要取10000模,计算矩阵的时候取模就可以了. 本题数据不强,不过数值本来就限制整数,故此可以0ms秒了. 下面程序十分清晰了,因为分开了几个小函数了,适合初学者参考下. #include <stdio.h> const int MOD = 10000; void mulOneMatrix(int F[2][2]) { int a = F[0][0]; int b = F[1][0]; F[0][0] = (a+b)%MOD

poj 3070 Fibonacci 矩阵快速幂

题目链接:http://poj.org/problem?id=3070 In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 for n ≥ 2. For example, the first ten terms of the Fibonacci sequence are: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, … An alternative formula for t

HDU1588-Gauss Fibonacci(矩阵快速幂+等比数列二分求和)

题目链接 题意:g(x) = k * x + b.f(x) 为Fibonacci数列.求f(g(x)),从x = 1到n的数字之和sum,并对m取模. 思路: 设A = |(1, 1),(1, 0)| sum = f(b) + f(k + b) + f(2k + b)...+f((n-1)k + b) (f(x) 为Fibonacci数列) sum = A^b + A^(k + b) + A^(2k + b)...+ A^((n-1)k + b) sum = A^b(1 + A^k + A^2k

poj 3070 Fibonacci (矩阵快速幂乘/模板)

题意:给你一个n,输出Fibonacci (n)%10000的结果 思路:裸矩阵快速幂乘,直接套模板 代码: #include <cstdio> #include <cstring> #include <iostream> using namespace std; typedef long long ll; const int N=2,M=2,P=2; const int MOD=10000; struct Matrix { ll m[N][N]; }; Matrix

POJ 3070 Fibonacci 矩阵高速求法

就是Fibonacci的矩阵算法.只是添加一点就是由于数字非常大,所以须要取10000模,计算矩阵的时候取模就能够了. 本题数据不强,只是数值本来就限制整数,故此能够0ms秒了. 以下程序十分清晰了,由于分开了几个小函数了.适合刚開始学习的人參考下. #include <stdio.h> const int MOD = 10000; void mulOneMatrix(int F[2][2]) { int a = F[0][0]; int b = F[1][0]; F[0][0] = (a+b

[POJ3070] Fibonacci|矩阵乘法

Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11024   Accepted: 7846 Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 for n ≥ 2. For example, the first ten terms of the Fibonacci sequenc

UVA10229Modular Fibonacci(矩阵快速幂)

题目链接 题目大意:给你i和m,求Mi, Mi = (F(i - 1) + F(i - 2)) % 2^m; 解题思路:因为Mi = (F(i - 1) % 2^m + F(i - 2)% 2^m) % 2^m = (M(i - 1) + M(i - 2)) % 2^m.类似于求fibonacci数加上取模,只是n很大,所以要用矩阵快速幂快速求解.参考 代码: #include <cstdio> #include <cstring> typedef long long ll; co