题意就是用矩阵乘法来求斐波那契数列的第n项的后四位数。如果后四位全为0,则输出0,否则
输出后四位去掉前导0,也。。。就。。。是。。。说。。。输出Fn%10000。
题目说的如此清楚。。我居然还在%和/来找后四位还判断是不是全为0还输出时判断是否为0然后
去掉前导0。o(╯□╰)o
还有矩阵快速幂的幂是0时要特判。
P.S:今天下午就想好今天学一下矩阵乘法方面的知识,这题是我的第一道正式接触矩阵乘法的题,欧耶!
#include<cstdio>
#include<iostream>
#include<cstring>
#define maxn 5
using namespace std;
const int mod = 10000;
int n,q;
struct Mat
{
int mp[maxn][maxn];
bool operator = (Mat a)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
mp[i][j] = a.mp[i][j];
}
}
};
Mat operator *(Mat a,Mat b)
{
Mat c;
memset(c.mp,0,sizeof(c.mp));
for(int k=0;k<n;k++)
{
for(int i=0;i<n;i++)
{
if(a.mp[i][k]<=0) continue;
for(int j=0;j<n;j++)
{
if(b.mp[k][j]<=0) continue;
c.mp[i][j] = c.mp[i][j]+(a.mp[i][k]*b.mp[k][j])%mod;
if(c.mp[i][j]>mod) c.mp[i][j]-=mod;
}
}
}
return c;
}
Mat operator ^(Mat a,int k)
{
Mat c;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
c.mp[i][j] = (i==j);
}
while(k)
{
if(k&1)
c = c*a;
a =a*a;
k>>=1;
}
return c;
}
int main()
{
while(scanf("%d",&q)!=EOF)
{
if(q == -1) break;
Mat x;
x.mp[0][0] = 0;
x.mp[0][1] = 1;
x.mp[1][0] = 1;
x.mp[1][1] = 1;
Mat y;
y.mp[0][0] = 0;
y.mp[1][0] = 1;
Mat z;
n = 2;
if(!q)
{
printf("0\n");
continue;
}
z = x^(q-1);
Mat tmp = z*y;
printf("%d\n",tmp.mp[1][0]%10000);
}
return 0;
}