代码一:
#include<iostream>
#include<cstdio>
using namespace std;
const int MOD = 10000;
int fast_mod(int n)
{
int base[2][2] = {1, 1, 1, 0};
int ans[2][2] = {1, 0, 0, 1};
int tmp[2][2];
while(n)
{
if(n & 1)
{
for(int i = 0; i < 2; i++)
for(int j = 0; j < 2; j++)
tmp[i][j] = ans[i][j];
ans[0][0] = ans[1][1] = ans[0][1] = ans[1][0] = 0;
for(int i = 0; i < 2; i++)
{
for(int j = 0; j < 2; j++)
{
for(int k = 0; k < 2; k++)
ans[i][j] = (ans[i][j] + base[i][k] * tmp[k][j]) % MOD;
}
}
}
for(int i = 0; i < 2; i++)
for(int j = 0; j < 2; j++)
tmp[i][j] = base[i][j];
base[0][0] = base[0][1] = base[1][0] = base[1][1] = 0;
for(int i = 0; i < 2; i++)
{
for(int j = 0; j < 2; j++)
{
for(int k = 0; k < 2; k++)
base[i][j] = (base[i][j] + tmp[i][k] * tmp[k][j]) % MOD;
}
}
n >>= 1;
}
return ans[0][1];
}
int main()
{
int n;
while(scanf("%d", &n) != EOF && n != -1)
{
printf("%d\n", fast_mod(n));
}
return 0;
}
代码二: 用结构体封装矩阵乘法
#include<iostream>
#include<cstdio>
using namespace std;
const int MOD = 10000;
struct matrix
{
int m[2][2];
}ans, base;
matrix multi(matrix a, matrix b)
{
matrix tmp;
for(int i = 0; i < 2; i++)
{
for(int j = 0; j < 2; j++)
{
tmp.m[i][j] = 0;
for(int k = 0; k < 2; k++)
tmp.m[i][j] = (tmp.m[i][j] + a.m[i][k] * b.m[k][j]) % MOD;
}
}
return tmp;
}
int fast_mod(int n)
{
base.m[0][0] = base.m[0][1] = base.m[1][0] = 1;
base.m[1][1] = 0;
ans.m[0][0] = ans.m[1][1] = 1;
ans.m[0][1] = ans.m[1][0] = 0;
while(n)
{
if(n & 1)
{
ans = multi(ans, base);
}
base = multi(base, base);
n >>= 1;
}
return ans.m[0][1];
}
int main()
{
int n;
while(scanf("%d", &n) != EOF && n != -1)
{
printf("%d\n", fast_mod(n));
}
return 0;
}