矩阵快速幂板子题。。
又是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<string.h>
#include<stdio.h>
using namespace std;
struct ju_zh
{
int m[2][2];
};
ju_zh ju_mul(ju_zh x,ju_zh y,int m)
{
ju_zh a;
a.m[0][0]=0,a.m[0][1]=0;
a.m[1][0]=0,a.m[1][1]=0;
for(int i=0; i<2; i++)
{
for(int j=0; j<2; j++)
{
for(int k=0; k<2; k++)
{
a.m[i][j]+=x.m[i][k]*y.m[k][j];
}
a.m[i][j]%=m;
}
}
return a;
}
int ju_mi(int n,int m)
{
ju_zh a,b;
a.m[0][0]=1,a.m[0][1]=0;
a.m[1][0]=0,a.m[1][1]=1;
b.m[0][0]=1,b.m[0][1]=1;
b.m[1][0]=1,b.m[1][1]=0;
while(n)
{
if(n%2==1)
a=ju_mul(a,b,m);
b=ju_mul(b,b,m);
n/=2;
}
return a.m[0][1];
}
int main()
{
int t;
scanf("%d",&t);
int n,m;
while(t--)
{
scanf("%d%d",&n,&m);
int z=ju_mi(n,m);
printf("%d\n",z);
}
}