| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
贴个代码,含比较详细的注释#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#include <map>
#include <sstream>
using namespace std;
#define INLINE inline
#ifdef LOCAL
#define ASSERT(x) do{if(!(x)) __asm{int 3};}while(0)
#else
#define ASSERT(x)
#endif
#define forn(i, a, b) for(int i = (a); i < (b); i++)
#define MAXN 5
typedef int Matrix [MAXN][MAXN];
/*
Let f(n, state) means the number of layouts from the nth column
when the initial layout is state.
state is(in following blocks, 1 means the place already tiled):
0: nothing putted:
0
0
0
0
1:
1
1
0
0
or
0
0
1
1
2:
1
0
0
1
3:
0
1
1
0
4:
1
1
1
1
The the iterating algorithm is :
f(n+1, 0) = f(n, 0) + 2 * f(n, 1) + f(n, 2) + f(n, 4)
f(n+1, 1) = f(n, 0) + f(n, 1)
f(n+1, 2) = f(n, 0) + f(n, 3)
f(n+1, 3) = f(n, 2)
f(n+1, 4) = f(n, 0)
Express as matrix:
[f(n, 0), f(n, 1), f(n, 2), f(n, 3), f(n, 4) ] * A = [f(n+1, 0), f(n+1, 1), f(n+1, 2), f(n+1, 3), f(n+1, 4) ]
*/
const int A[MAXN][MAXN] =
{
{1, 1, 1, 0, 1},
{2, 1, 0, 0, 0},
{1, 0, 0, 1, 0},
{0, 0, 1, 0, 0},
{1, 0, 0, 0, 0}
};
// I, unit matrix
const int I[MAXN][MAXN] =
{
{1, 0, 0, 0, 0},
{0, 1, 0, 0, 0},
{0, 0, 1, 0, 0},
{0, 0, 0, 1, 0},
{0, 0, 0, 0, 1}
};
// The initial state, f(1, state)
const Matrix init =
{
{1, 1, 1, 0, 1}
};
const int n = 5;
int N, M;
int add(int i, int j)
{
return (i+j)%M;
}
void mul(Matrix& m, int row, int col, const Matrix&m2, int col2)
{
Matrix result = {0};
forn(i, 0, row)
forn(j, 0, col2)
forn(k, 0, col)
result[i][j] = add(result[i][j], m[i][k]*m2[k][j]);
memcpy(m, result, sizeof(result));
}
void add(Matrix&A, const Matrix& I)
{
forn(i, 0, n)
forn(j, 0, n)
A[i][j] = add(A[i][j],I[i][j]);
}
void pow(Matrix&m, int t)
{
Matrix result;
memcpy(result, I, sizeof(I));
while(t)
{
int x = t % 2;
if(x)
mul(result, n, n, m, n);
mul(m, n, n, m, n);
t /= 2;
}
memcpy(m, result, sizeof(m));
}
void solve()
{
Matrix a;
memcpy(a, A, sizeof(a));
pow(a, N-1);
Matrix result;
memcpy(result, init, sizeof(init));
mul(result, 1, 5, a, 5);
cout << result[0][0] << "\n";
}
int main()
{
ASSERT(freopen("in.txt", "r", stdin));
while(cin >> N >> M, N)
{
solve();
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator