1250 Fibonacci数列

Posted 神犇(shenben)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1250 Fibonacci数列相关的知识,希望对你有一定的参考价值。

1250 Fibonacci数列

 

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 钻石 Diamond
 
 
题目描述 Description

定义:f0=f1=1, fn=fn-1+fn-2(n>=2)。{fi}称为Fibonacci数列。

输入n,求fn mod q。其中1<=q<=30000。

输入描述 Input Description

第一行一个数T(1<=T<=10000)。

以下T行,每行两个数,n,q(n<=109, 1<=q<=30000)

输出描述 Output Description

文件包含T行,每行对应一个答案。

样例输入 Sample Input

3

6 2

7 3

7 11

样例输出 Sample Output

1

0

10

数据范围及提示 Data Size & Hint

1<=T<=10000

n<=109, 1<=q<=30000

分类标签 Tags 点此展开 

 
AC代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int a[2][2],b[2][2],c[2][2];
int main(){
    int T,n,mod;
    scanf("%d",&T);
    while(T--){
        scanf("%d%d",&n,&mod);
        if(n==1){printf("%d\n",1%mod);continue;}
        if(n==2){printf("%d\n",1%mod);continue;}
        if(n==3){printf("%d\n",2%mod);continue;}
        n-=2;
        a[0][0]=1;a[0][1]=1;a[1][0]=1;a[1][1]=0;
        b[0][0]=1;b[0][1]=1;b[1][0]=1;b[1][1]=0;
        while(n){
            if(n&1){
                c[0][0]=(a[0][0]*b[0][0]%mod+a[0][1]*b[1][0]%mod)%mod;
                c[0][1]=(a[0][0]*b[0][1]%mod+a[0][1]*b[1][1]%mod)%mod;
                c[1][0]=(a[1][0]*b[0][0]%mod+a[1][1]*b[1][0]%mod)%mod;
                c[1][1]=(a[1][0]*b[0][1]%mod+a[1][1]*b[1][1]%mod)%mod;
                memcpy(a,c,sizeof c);
            }
            c[0][0]=(b[0][0]*b[0][0]%mod+b[0][1]*b[1][0]%mod)%mod;
            c[0][1]=(b[0][0]*b[0][1]%mod+b[0][1]*b[1][1]%mod)%mod;
            c[1][0]=(b[1][0]*b[0][0]%mod+b[1][1]*b[1][0]%mod)%mod;
            c[1][1]=(b[1][0]*b[0][1]%mod+b[1][1]*b[1][1]%mod)%mod;
            memcpy(b,c,sizeof c);
            n>>=1;
        }
        printf("%d\n",(a[0][0]+a[0][1])%mod);
    }
    return 0;
}

 

以上是关于1250 Fibonacci数列的主要内容,如果未能解决你的问题,请参考以下文章

矩阵乘法快速幂 codevs 1250 Fibonacci数列

1250 Fibonacci数列

Fibonacci数列(codevs 1250)

1732 Fibonacci数列 2

矩阵乘法快速幂 codevs 1732 Fibonacci数列 2

hdu 1250 Hat&#39;s Fibonacci