1.题目链接。说这个题之前想说一下刚才切的一个水题,就是HDU1205.这个题其实很简单,就是相同的东西不能连续的放在一起。emmm,那么找一下最大的那个数量mmax,他会提供mmax-1个空位,算一下剩下的东西能不能把这些空位填满即可。那么再来看这个题目,很经典的fib问题,就是矩阵快速幂,不能再裸了。转移矩阵都给了。那行吧,就直接上代码了。(PS:注意把头文件该一下,POJ不支持万能头)
#include<bits/stdc++.h>
using namespace std;
#pragma warning(disable:4996)
int lenth = 2;
int mod = 10000;
struct Sarray
{
int data[2][2];
Sarray operator *(const Sarray&a)
{
Sarray tem;
for (int i = 0; i < lenth; i++) {
for (int j = 0; j < lenth; j++) {
for (int k = 0; k < lenth; k++) {
tem.data[i][j] = (tem.data[i][j] + data[i][k] * a.data[k][j]) % mod;
}
}
}
return tem;
}
Sarray operator +(const Sarray&a) {
Sarray tem;
for (int i = 0; i < lenth; i++) {
for (int j = 0; j < lenth; j++) {
tem.data[i][j] = (data[i][j] + a.data[i][j]) % mod;
}
}
return tem;
}
Sarray(const Sarray&a) {
for (int i = 0; i < lenth; i++) {
for (int j = 0; j < lenth; j++) {
data[i][j] = a.data[i][j];
}
}
}
Sarray() {
memset(data, 0, sizeof(data));
}
};
Sarray E;
void ini() {
for (int i = 0; i < lenth; i++)
for (int j = 0; j < lenth; j++)
if (i == j)E.data[i][j] = 1;
else E.data[i][j] = 0;
}
Sarray qpow(Sarray a, int b) {
Sarray tem = E;
while (b) {
if (b & 1)tem = a * tem;
a = a * a;
b >>= 1;
}
return tem;
}
int main()
{
int n;
ini();
Sarray a;
a.data[0][0] = 1;
a.data[0][1] = 1;
a.data[1][0] = 1;
a.data[1][1] = 0;
Sarray b;
while (scanf("%d", &n) && n != -1)
{
b = qpow(a, n);
printf("%d\n", b.data[0][1]);
}
}