又是Fibonacci | ||||||
| ||||||
Description | ||||||
斐波那契数真是神奇的数字呵。你们应该都对它很熟悉了吧? 斐波那契序列 <F[n]> 是如下定义的: f[0] = 0; f[1] = 1; f[n] = f[n-1]+f[n-2]; (n>1) 随着 n 的增长f[n]增长的速度非常快。 所以,每次你只要输出 f[n] 对 m 取模的结果就可以了。 | ||||||
Input | ||||||
多组测试数据,数据的第一行是一个整数T 表示数据组数; 接下来的T 行每行两个整数 n(0<n<232), m(0<m<10000)。 | ||||||
Output | ||||||
输出T 行,每行一个整数表示 f[n] % m 的结果。 | ||||||
Sample Input | ||||||
2 1 10000 2 100 | ||||||
Sample Output | ||||||
1 1 | ||||||
Source | ||||||
2014.11.30新生赛-正式赛 |
#include<iostream>
#include<cstdio>
#include<string.h>
#define mem(a,b) memset(a,b,sizeof(a));
using namespace std;
int m;
struct mat
{
int a[2][2];
};
mat mat_mul(mat x,mat y)//矩阵乘法
{
mat res;
mem(res.a,0);
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
for(int k=0;k<2;k++){
res.a[i][j]+=x.a[i][k]*y.a[k][j];
}
res.a[i][j]%=m;
}
}
return res;
}
int pow(long n)
{
mat s1,s2;
mem(s1.a,0);
s2.a[0][0]=s2.a[0][1]=s2.a[1][0]=1;
s2.a[1][1]=0;//构造矩阵
for(int i=0;i<2;i++)
s1.a[i][i]=1;//单位阵
while(n)//快速幂部分
{
if(n&1==1){
s1=mat_mul(s1,s2);}//更新s1
s2=mat_mul(s2,s2);
n>>=1;
}
return s1.a[0][1];//s1.a[1][0]也可以
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
long n;
scanf("%ld%d",&n,&m);
int t=pow(n);
printf("%d\n",t);
}
}
矩阵快速幂一般都需要自己找递推式...初学矩阵快速幂,还没有接触。