HDU 3936 斐波那契性质矩阵连乘

题意:p[i]=fib[4*i-1] 给出L,R,求出中间的p[i]的和。

利用性质:p[1]+p[2]+...+p[n]=f[1]^2+f[2]^2+...+f[2*n-1]^2+f[2*n]^2=f[2*n]*f[2*n+1]

fibonacci数列的性质:

1.gcd(fib(n),fib(m))=fib(gcd(n,m))

证明:可以通过反证法先证fibonacci数列的任意相邻两项一定互素,然后可证n>m时gcd(fib(n),fib(m))=gcd(fib(n-m),fib(m)),递归可

求gcd(fib(n),fib(m))=gcd(fib(k),fib(l)),最后k=l,不然继续递归。K是通过展转相减法求出,易证k=gcd(n,m),所以gcd(fib(n),fib(m))

=fib(gcd(n,m))。

2.如果fib(k)能被x整除,则fib(k*i)都可以被x整除。

3.f(0)+f(1)+f(2)+…+f(n)=f(n+2)-1

4.f(1)+f(3)+f(5)+…+f(2n-1)=f(2n)

5.f(2)+f(4)+f(6)+…+f(2n) =f(2n+1)-1

6.[f(0)]^2+[f(1)]^2+…+[f(n)]^2=f(n)·f(n+1)

7.f(0)-f(1)+f(2)-…+(-1)^n·f(n)=(-1)^n·[f(n+1)-f(n)]+1

8.f(m+n)=f(m-1)·f(n-1)+f(m)·f(n)

9.[f(n)]^2=(-1)^(n-1)+f(n-1)·f(n+1)

10.f(2n-1)=[f(n)]^2-[f(n-2)]^2

11.3f(n)=f(n+2)+f(n-2)

12.f(2n-2m-2)[f(2n)+f(2n+2)]=f(2m+2)+f(4n-2m) [ n〉m≥-1,且n≥1]

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define M 1000000007
const int MAX=2;
typedef long long int64;
typedef struct
{
    long long m[MAX][MAX];
} Matrix;
Matrix P=
{
    0,1,
    1,1,
};
Matrix I=
{
    1,0,
    0,1,
};
Matrix matrixmul(Matrix a,Matrix b) //矩阵乘法
{
    int i,j,k;
    Matrix c;
    for (i = 0 ; i < MAX; i++)
        for (j = 0; j < MAX; j++)
        {
            c.m[i][j] = 0;
            for (k=0; k<MAX; k++)
                c.m[i][j]+=(a.m[i][k]*b.m[k][j])%M;
            c.m[i][j]%=M;
        }
    return c;
}
Matrix quickpow(long long n)
{
    Matrix m = P, b = I;
    while (n >= 1)
    {
        if (n & 1)
            b = matrixmul(b,m);
        n = n >> 1;
        m = matrixmul(m,m);
    }
    return b;
}
int main()
{
    int t;
    long long l,r;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%I64d%I64d",&l,&r);
        long long x,y;
        Matrix a=quickpow(2*l-3),b=quickpow(2*l-2);
        x=((a.m[0][0]+a.m[0][1])%M)*((b.m[0][0]+b.m[0][1])%M)%M;
        if(l==1)
            x=0;
        a=quickpow(2*r-1),b=quickpow(2*r);
        y=((a.m[0][0]+a.m[0][1])%M)*((b.m[0][0]+b.m[0][1])%M)%M;
        long long ans=((y-x)%M+M)%M;
        printf("%I64d\n",ans);
    }
    return 0;
}
时间: 2024-10-03 22:10:50

HDU 3936 斐波那契性质矩阵连乘的相关文章

HDU 3978 斐波那契循环节

题意:给出f(f(f...f(n)...)) 总共嵌套k次.问最后模p的值是多少. 首先应该明白的是这个题有循环节的.一个数模N的循环节就是这个数分解成素因子乘积的形式p1^a1*p2^a2*p3^a3...后,斐波那契模pi^ai的循环节的最大公约数. 那么一个素数的k次幂的循环节=斐波那契模上这个素数的循环节乘上p^(k-1). 而一个素数p的循环节 如果p>5并且是5的二次剩余,那么循环节就是(p-1)的因子,否则就是2*(p+1)的因子.所以2 3 5 的时候需要特判一下. 知道这些就能

斐波那契数列 矩阵求法 优化

在做编程题目的时候经常会遇到"斐波那契数列"相关的题目,尤其在做OJ中.下面说一些方法: (一)递归 递归是最慢的会发生重复计算,时间复杂度成指数级. long long fac(int n) { if(n==1) return 1; else if(n==2) return 2; else return fac(n-1)+fac(n-2); } (二)循环 利用临时变量来保存中间的计算过程,加快运算. long long fac(int n) { long long a=1,b=2,

NEFU 41 斐波那契性质

网址:http://acm.nefu.edu.cn/test/problemshow.php 题意:f[1] = 1; f[2] = 2;f[n] = f[n - 1] + f[n - 2]; And s[n] is defined:   ans = as[x] % n; 根据性质:f[0]^2+f[1]^2+...+f[n]^2=f[n]*f[n+1]  ans=a^(f[x]*f[x+1]-1)%n再根据欧拉定理向下降幂就可以了. #include <iostream> #include&

10299 Problem A: Modular Fibonacci(斐波那契的矩阵快速幂)

Problem A: Modular Fibonacci The Fibonacci numbers (0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...) are defined by the recurrence: F0 = 0 F1 = 1 Fi = Fi-1 + Fi-2 for i>1 Write a program which calculates Mn = Fn mod 2m for given pair of n and m. 0 n 2147483

hdu 4549 M斐波那契数列

click here ~~ Problem Description M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = a F[1] = b F[n] = F[n-1] * F[n-2] ( n > 1 ) 现在给出a, b, n,你能求出F[n]的值吗? Input 输入包含多组测试数据: 每组数据占一行,包含3个整数a, b, n( 0 <= a, b, n <= 10^9 ) Output 对每组测试数据请输出一个整数F[n],由于F[n]可能很大,你只需输出F[n

UVa 10229 Modular Fibonacci:矩阵快速幂求斐波那契

10229 - Modular Fibonacci Time limit: 3.000 seconds http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=115&page=show_problem&problem=1170 The Fibonacci numbers (0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...) are defin

代码-关于斐波那契矩阵,用递归二分法。哪位大神帮忙看看哪里出问题了?

问题描述 关于斐波那契矩阵,用递归二分法.哪位大神帮忙看看哪里出问题了? #include #include #include #define MAX 100 using namespace std; typedef struct fibo { int i1j1; int i1j2; int i2j1; int i2j2; }fibo; fibo a[MAX]; fibo FIBO(int num); fibo MUL(fibo x,fibo y) {//x.y,2个矩阵相乘, fibo w;

斐波那契数列 优化矩阵求法实例_C 语言

在做编程题目的时候经常会遇到"斐波那契数列"相关的题目,尤其在做OJ中.下面说一些方法: (一)递归 递归是最慢的会发生重复计算,时间复杂度成指数级. 复制代码 代码如下: long long fac(int n){ if(n==1) return 1; else if(n==2)  return 2; else   return fac(n-1)+fac(n-2);} (二)循环 利用临时变量来保存中间的计算过程,加快运算. 复制代码 代码如下: long long fac(int

类斐波那契数列的奇妙性质

1.1.2.3.5.8.13.21.--.这个数列称为斐波那契数列(Fibonacci Sequence). 它有个奇妙的性质,记FN为斐波那契数列的第N项,则当N比较大的时候 FN/FN+1≈0.618   斐波那契数列有两个常见的通项公式(具体的推导过程就忽略了) 1. FN=FN-1+FN-2(N>2),F1=1,F2=2   2.   这个数列的前两项F1=1,F2=1才称为斐波那契数列,如果这个数列的前两项是其他数字(正数),并且还有FN=FN-1+FN-2(N>2)的递推关系,那么