标签: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