码迷,mamicode.com
首页 > 其他好文 > 详细

Fibonacci数列

时间:2016-07-24 20:39:52      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:

【题目描述】

定义:F[0]=F[1]=1,F[n]=F[n-1]+F[n-2](n >= 2)。{F[i]}称为Fibonacci数列。

输入n和q,求F[n] mod q。

【输入描述】

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

以下T行,每行两个数:n、q(n <= 10^9,1 <= q <= 30000)。

【输出描述】

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

【样例输入】

3

6 2

7 3

7 11

【样例输出】

1

0

10

源代码:

#include<cstdio>
int n;
void x1(int x,int y)
{
    x-=2; //利用规律:[F(n),F(n-1)]=[F(n-1),F(n-2)]*[1,1/1,0]。
    int t1=1,t2=0,t3=0,t4=1; //在矩阵乘法中,[1,1/1,1]的作用并不等于1的作用。
    int x1=1,x2=1,x3=1,x4=0;
    while (x)
    {
        if (x%2)
        {
            int y1=t1,y2=t2,y3=t3,y4=t4;
            t1=((y1*x1)%y+(y2*x3)%y)%y;
            t2=((y1*x2)%y+(y2*x4)%y)%y;
            t3=((y3*x1)%y+(y4*x3)%y)%y;
            t4=((y3*x2)%y+(y4*x4)%y)%y;
        }
        x/=2;
        int y1=x1,y2=x2,y3=x3,y4=x4;
        x1=((y1*y1)%y+(y2*y3)%y)%y;
        x2=((y1*y2)%y+(y2*y4)%y)%y;
        x3=((y3*y1)%y+(y4*y3)%y)%y;
        x4=((y3*y2)%y+(y4*y4)%y)%y;
    } //矩阵快速幂。
    printf("%d\n",(t1+t3)%y);
}
int main()
{
    scanf("%d",&n);
    for (int a=1;a<=n;a++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        x1(x+1,y); //注意,此Fibonacci数列从0开始。
    }
    return 0;
}

Fibonacci数列

标签:

原文地址:http://www.cnblogs.com/Ackermann/p/5701405.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!