题目链接:Modular Fibonacci UVA - 10229
题目大意:输入n与m,输出f[n]%m。f[n]为斐波那契数列里的第n个数。
n比较大,可以借助矩阵快速幂来求斐波那契数列的第n项。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
typedef long long LL;
const int N=2;
LL MOD;
struct Matrix
{
LL m[N][N];
Matrix()
{
memset(m,0,sizeof(m));
}
Matrix operator * (const Matrix& y)
{
Matrix z;
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
for(int k=0;k<N;k++)
{
z.m[i][j]+=m[i][k]*y.m[k][j]%MOD;
z.m[i][j]%=MOD;
}
return z;
}
};
Matrix Matrix_Postpower(Matrix x,int n)
{
Matrix z;
z.m[0][0]=z.m[1][1]=1;
z.m[0][1]=z.m[1][0]=0;
while(n)
{
if(n&1)
z=z*x;
x=x*x;
n>>=1;
}
return z;
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
Matrix x;
x.m[0][0]=x.m[0][1]=x.m[1][0]=1;
x.m[1][1]=0;
MOD=1LL<<m;
Matrix t=Matrix_Postpower(x,n);
printf("%lld\n",t.m[1][0]*1);
}
return 0;
}