题目链接:http://poj.org/problem?id=3070
类型:矩阵快速幂
矩阵快速幂的入门题(板子题)
C
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
const int mod=10000;
struct Matrix
{
int a[2][2];
};
Matrix operator * (Matrix a,Matrix b)
{
Matrix ans;
memset(ans.a,0,sizeof(ans.a));
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
for(int k=0;k<2;k++)
ans.a[i][j]=(ans.a[i][j]+a.a[i][k]*b.a[k][j])%mod;
return ans;
}
int quick(Matrix a,int k)
{
k--;
Matrix b=a;
while(k)
{
if(k&1)b=b*a;
a=a*a;
k>>=1;
}
return b.a[0][0];
}
int main()
{
int a;
while(scanf("%d",&a),a!=-1)
{
if(a==0){
printf("0\n");
continue;
}
if(a==1||a==2){
printf("1\n");
continue;
}
Matrix m;
m.a[0][0]=m.a[0][1]=m.a[1][0]=1;m.a[1][1]=0;
printf("%d\n",quick(m,a-1));
}
return 0;
}
java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner kb = new Scanner(System.in);
while (kb.hasNext()) {
int a = kb.nextInt();
if (a == -1)
break;
if (a == 0) {
System.out.println(0);
continue;
}
if (a == 1 || a == 2) {
System.out.println(1);
continue;
}
Matrix m = new Matrix();
m.a[0][1] = m.a[0][0] = m.a[1][0] = 1;
System.out.println(quick(m, a - 1));
}
kb.close();
}
static int quick(Matrix n, int m) {
m--;
Matrix t = new Matrix();
t.a[0][1] = t.a[0][0] = t.a[1][0] = 1;
while (m != 0) {
if ((m & 1) == 1)
t.Multi(n);
n.Multi(n);
m >>= 1;
}
return t.a[0][0];
}
}
class Matrix {
int a[][];
private final int mod = 10000;
public Matrix() {
super();
a = new int[2][2];
}
public void Multi(Matrix m) {
Matrix ans = new Matrix();
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
for (int k = 0; k < 2; k++) {
ans.a[i][j] = (ans.a[i][j] + a[i][k] * m.a[k][j]) % mod;
}
}
}
a = ans.a;
}
}