题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=148
矩阵快速幂入门题,身为连线代都没学过的渣渣,为了学矩阵快速幂,还得百度矩阵学习矩阵。。不过矩阵快速幂好强大,之前只知道快速幂取余,没想到过斐波那契数列还可以用快速幂来解。
矩阵快速幂最重要的是根据表达式找出矩阵,比如斐波那契数列为f(n)=f(n-1)+f(n-2) (n>=2)
[f(n) (n-1)]=[f(n-1) f(n-2)]*
[1110]
类似于快速幂,由此可求出
代码:
#include<stdio.h>
#include<string.h>
int n;
struct stu
{
int m[2][2];
} a,b; //定义矩阵
stu multi(stu x,stu y) //矩阵的乘法
{
stu temp;
int i,j,k;
for(i=0; i<2; i++)
{
for(j=0; j<2; j++)
temp.m[i][j]=(x.m[i][0]*y.m[0][j]+x.m[i][1]*y.m[1][j])%10000;
}
return temp; //返回类型为结构体
}
int quick_mod()
{
a.m[0][0]=a.m[1][1]=1;
a.m[0][1]=a.m[1][0]=0; //初始化a为单位矩阵
b.m[0][0]=b.m[0][1]=b.m[1][0]=1;
b.m[1][1]=0; //
while(n) //快速求n次幂
{
if(n&1) //若n为奇数
a=multi(a,b); //
b=multi(b,b); //和快速幂原理相同
n>>=1; //n缩小为原来一半
}
return a.m[0][1]; //返回值,注意此处不为a.m[0][0],a.m[0][0]为n+1对应的值,
}
int main()
{
while(scanf("%d",&n)&&n!=EOF)
{
printf("%d\n",quick_mod());
}
}