矩阵乘法:
struct matrix
{
int m[2][2];
};
matrix mul(matrix a,matrix b)
{
matrix c;
c.m[0][0]=(a.m[0][0]*b.m[0][0]+a.m[0][1]*b.m[1][0])%k;
c.m[0][1]=(a.m[0][0]*b.m[0][1]+a.m[0][1]*b.m[1][1])%k;
c.m[1][0]=(a.m[1][0]*b.m[0][0]+a.m[1][1]*b.m[1][0])%k;
c.m[1][1]=(a.m[1][0]*b.m[0][1]+a.m[1][1]*b.m[1][1])%k;
return c;
}
矩阵快速幂:
struct matrix
{
int m[2][2];
};
matrix did(matrix a,long long n)
{
matrix c;
if (n==0) {c.m[0][0]=1;c.m[0][1]=0;c.m[1][0]=0;c.m[1][1]=1;}
else
{ matrix d;
d=did(a,n/2);
if (n%2==1) c=mul(mul(d,d),a);
else c=mul(d,d);
}
return c;
}
#include <iostream>
#include <stdio.h>using namespace std;
int k=10000;
struct matrix
{
int m[2][2];
};
matrix mul(matrix a,matrix b)
{
matrix c;
c.m[0][0]=(a.m[0][0]*b.m[0][0]+a.m[0][1]*b.m[1][0])%k;
c.m[0][1]=(a.m[0][0]*b.m[0][1]+a.m[0][1]*b.m[1][1])%k;
c.m[1][0]=(a.m[1][0]*b.m[0][0]+a.m[1][1]*b.m[1][0])%k;
c.m[1][1]=(a.m[1][0]*b.m[0][1]+a.m[1][1]*b.m[1][1])%k;
return c;
}
matrix did(matrix a,long long n)
{
matrix c;
if (n==0) {c.m[0][0]=1;c.m[0][1]=0;c.m[1][0]=0;c.m[1][1]=1;}
else
{ matrix d;
d=did(a,n/2);
if (n%2==1) c=mul(mul(d,d),a);
else c=mul(d,d);
}
return c;
}
int main()
{ long long n;
matrix ans,e;
freopen("in.txt","r",stdin);
e.m[0][0]=1;e.m[0][1]=1;e.m[1][0]=1;e.m[1][1]=0;
while (cin>>n)
{
if (n==-1) break;
if (n==0) cout<<'0'<<endl;
else
{
ans=did(e,n-1);
cout<<ans.m[0][0]%k<<endl;
}
}
return 0;
}
题意:求第m个斐波那契数MOD10000的结果