方法一:矩阵快速幂取模求斐波那契数列
#include<iostream>
#include<cstdio>
#define maxn 10000
using namespace std;
struct Matrix
{
int v[2][2];
}m;
Matrix Mul(Matrix A,Matrix B)
{
Matrix c;
c.v[0][0]=(A.v[0][0]*B.v[0][0]+A.v[0][1]*B.v[1][0])%maxn;
c.v[0][1]=(A.v[0][0]*B.v[0][1]+A.v[0][1]*B.v[1][1])%maxn;
c.v[1][0]=(A.v[1][0]*B.v[0][0]+A.v[1][1]*B.v[1][0])%maxn;
c.v[1][1]=(A.v[1][0]*B.v[0][1]+A.v[1][1]*B.v[1][1])%maxn;
return c;
}
Matrix mtPow(Matrix A,int k)
{
if(k==1) return m;
Matrix b=mtPow(A,k/2);
if(k%2) return Mul(Mul(b,b),m);
return Mul(b,b);
}
int main()
{
int n;
m.v[0][0]=1;
m.v[0][1]=1;
m.v[1][0]=1;
m.v[1][1]=0;
while(scanf("%d",&n)&&n!=-1)
{
if(n==0)
{
printf("0\n");
continue;
}
Matrix u;
u=mtPow(m,n);
printf("%d\n",u.v[0][1]);
}
return 0;
}
方法二:
这个代码是从网上找到的,但是感觉特别适用,尽管现在有几个地方我还不是特别理解,所以先贴进
来,以后慢慢懂。
# include <stdio.h>
#include<string.h>
# define MAXN 30
# define MOD 10000
short int power[MAXN][4] = {{1,1,1,0}};
short int ans[4];
void mul(short int *a, short int *b, short int *c);
int main()
{
int n, i;
for (i = 1; i < MAXN; ++i)
mul(power[i], power[i-1], power[i-1]);
while(~scanf("%d",&n))
{
ans[0] = ans[3] = 1;
ans[1] = ans[2] = 0;
if (n == -1) break;
for (i = 0; i < MAXN; ++i)
if (n & (0x1<<i)) mul(ans, ans, power[i]);
printf("%d\n", ans[1]);
}
return 0;
}
void mul(short int *a, short int *b, short int *c)
{
short int t[4];
t[0] = (b[0]*c[0] + b[1]*c[2]) % MOD;
t[1] = (b[0]*c[1] + b[1]*c[3]) % MOD;
t[2] = (b[2]*c[0] + b[3]*c[2]) % MOD;
t[3] = (b[2]*c[1] + b[3]*c[3]) % MOD;
memcpy(a, t, sizeof(t));
}