http://poj.org/problem?id=3070
據說這是一道非常簡單的矩陣乘法題目,小孩子都會做。。
那我呢,思考了那麼久
二進制數有多少個1就代碼就執行多少次。
第一個代碼:
#include <stdio.h>
#include <string.h>
#define MAXN 20 + 10
int n;
int a11, a12, a21, a22;
int b11, b12, b21, b22;
int c11, c12, c21, c22;
int d11, d12, d21, d22;
int main()
{
while(~scanf("%d", &n) && n != -1)
{
// 數據初始化
a11 = 1;
a12 = 1;
a21 = 1;
a22 = 0;
b11 = 1;
b12 = 0;
b21 = 0;
b22 = 1;
// 算法主體
if(n == 0)
{
printf("0\n");
continue;
}
while(n)
{
if(n & 1)
{
c11 = (a11 * b11 + a12 * b21) % 10000;
c12 = (a11 * b12 + a12 * b22) % 10000;
c21 = (a21 * b11 + a22 * b21) % 10000;
c22 = (a21 * b12 + a22 * b22) % 10000;
b11 = c11;
b12 = c12;
b21 = c21;
b22 = c22;
}
d11 = (a11 * a11 + a12 * a21) % 10000;
d12 = (a11 * a12 + a12 * a22) % 10000;
d21 = (a21 * a11 + a22 * a21) % 10000;
d22 = (a21 * a12 + a22 * a22) % 10000;
a11 = d11;
a12 = d12;
a21 = d21;
a22 = d22;
n >>= 1;
}
printf("%d\n", b12);
}
return 0;
}
第2個代碼:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n = 2, m;
int s[2][2]={{1, 1}, {1, 0}};
struct matrix
{
int r, c;
int mat[3][3];
} res, origin;
void init()
{
memset(res.mat, 0, sizeof(res.mat));
res.r = n;
res.c = n;
for(int i = 1; i <= n; i++)
{
res.mat[i][i] = 1;
}
origin.c = n;
origin.r = n;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
origin.mat[i][j] = s[i - 1][j - 1];
}
}
matrix multi(matrix x, matrix y)
{
matrix t;
int i, j, k;
memset(t.mat, 0, sizeof(t.mat));
t.r = x.r;
t.c = y.c;
for(i = 1; i <= x.r; i++)
{
for(k = 1; k <= x.c; k++)
if(x.mat[i][k])
{
for(j = 1; j <= y.c; j++)
{
t.mat[i][j] += (x.mat[i][k] * y.mat[k][j]) % 10000;
t.mat[i][j] %= 10000;
}
}
}
return t;
}
int main()
{
int m;
while(scanf("%d", &m) != EOF)
{
if(m == -1) break;
init();
while(m)
{
if(m & 1) //核心代碼
{
res = multi(origin, res);
}
origin = multi(origin, origin);
m = m >> 1;
}
printf("%d\n", res.mat[1][2] % 10000);
}
return 0;
}