您的位置:首页 > 其它

hdu 5015 233 Matrix(矩阵快速幂)

2014-09-15 19:38 417 查看
题目链接:hdu 5015 233 Matrix

题目大意:给定一个矩阵第一列,然后第一行为233,2333,23333....问说n行m列的数为多少。

解题思路:根据数据范围很明显是矩阵快速幂,构造一个(n+2)(n+2)矩阵,递推每一列。
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
typedef long long ll;

const ll mod = 10000007;
const int maxn = 15;

struct Mat {
int r, c;
ll s[maxn][maxn];

Mat (int r = 0, int c = 0) {
this->r = r;
this->c = c;
memset(s, 0, sizeof(s));
}

void init(int n) {
r = c = n + 2;
memset(s, 0, sizeof(s));
s[0][0] = s[1][0] = 1;
s[1][1] = 10;
for (int i = 2; i < r; i++) {
for (int j = 1; j <= i; j++)
s[i][j] = 1;
}
}

Mat operator * (const Mat& u) {
Mat ret(r, u.c);
for (int i = 0; i < r; i++) {
for (int j = 0; j < u.c; j++)
for (int k = 0; k < c; k++)
ret.s[i][j] = (ret.s[i][j] + s[i][k] * u.s[k][j]) % mod;
}
return ret;
}
};

int N, M;

Mat pow_mat (Mat ret, int n) {
Mat x;
x.init(N+2);
while (n) {
if (n&1)
ret = x * ret;
x = x * x;
n >>= 1;
}
return ret;
}

int main () {
while (scanf("%d%d", &N, &M) == 2) {
Mat ans(N + 2, 1);
ans.s[0][0] = 3;
ans.s[1][0] = 233;
for (int i = 1; i <= N; i++)
scanf("%I64d", &ans.s[i+1][0]);
ans = pow_mat(ans, M);
printf("%I64d\n", ans.s[N+1][0]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: