标签:des style blog os io for 2014 ar
Description
Input
Output
Sample Input
1 4 0
Sample Output
1 10
题意:给定n个环和规则:如果想取下第n个环那么要保证前n-2都取下,第n-1还在
思路:设取下第n个环的最短时间是f[n],那么要想取下第n个环,首先要取下前n-2个即:f[n-2]以及最后一个,所以是
f[n-2]+1, 还有一个第n-1个,要取下它首先要保证第n-2在,所以需要f[n-2](怎么取下来的怎么放上去),现在又要取第n-1个了, 综上所述:f[n] = 2*f[n-2] + f[n-1] + 1, 然后就是构造矩阵了:
不难推出来: | f[n] | | 1 2 1 | | f[n-2]|
| f[n-1] | = | 1 0 0 | * | f[n-1]|
| 1 | | 0 0 1 | | 1 |
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int maxn = 10;
const int mod = 200907;
int cnt;
struct Matrix {
int v[maxn][maxn];
Matrix() {}
Matrix(int x) {
init();
for (int i = 0; i < maxn; i++)
v[i][i] = x;
}
void init() {
memset(v, 0, sizeof(v));
}
Matrix operator *(Matrix const &b) const {
Matrix c;
c.init();
for (int i = 0; i < cnt; i++)
for (int j = 0; j < cnt; j++)
for (int k = 0; k < cnt; k++)
c.v[i][j] = (c.v[i][j] + (ll)v[i][k]*b.v[k][j]) % mod;
return c;
}
Matrix operator ^(int b) {
Matrix a = *this, res(1);
while (b) {
if (b & 1)
res = res * a;
a = a * a;
b >>= 1;
}
return res;
}
} a, b, tmp;
int main() {
int n;
while (scanf("%d", &n) != EOF && n != 0) {
if (n < 3) {
printf("%d\n", n);
continue;
}
a.init();
cnt = 3;
a.v[0][0] = a.v[0][2] = a.v[1][0] = a.v[2][2] = 1;
a.v[0][1] = 2;
tmp = a^(n-2);
printf("%d\n", (tmp.v[0][0]*2 + tmp.v[0][1] + tmp.v[0][2]) % mod);
}
return 0;
}HDU - 2842 Chinese Rings,布布扣,bubuko.com
标签:des style blog os io for 2014 ar
原文地址:http://blog.csdn.net/u011345136/article/details/38305159