1250 Fibonacci数列
Posted 神犇(shenben)
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1250 Fibonacci数列相关的知识,希望对你有一定的参考价值。
题目描述 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数列的主要内容,如果未能解决你的问题,请参考以下文章