hdu 5015 233 Matrix(矩阵快速幂)
2014-09-15 19:38
417 查看
题目链接:hdu 5015 233 Matrix
题目大意:给定一个矩阵第一列,然后第一行为233,2333,23333....问说n行m列的数为多少。
解题思路:根据数据范围很明显是矩阵快速幂,构造一个(n+2)(n+2)矩阵,递推每一列。
题目大意:给定一个矩阵第一列,然后第一行为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; }
相关文章推荐
- HDU 5015 233 Matrix(矩阵快速幂)
- 【HDU】5015 233 Matrix 矩阵快速幂
- HDU 5015 233 Matrix(矩阵快速幂)
- hdu 5015 233 Matrix(矩阵快速幂)
- HDU 5015 233 Matrix 矩阵快速幂
- HDU 5015 233 Matrix(矩阵快速幂)
- HDU 5015 233 Matrix(矩阵快速幂)
- HDU 5015 233 Matrix(网络赛1009) 矩阵快速幂
- HDU 5015 233 Matrix --矩阵快速幂
- hdu 5015 233 Matrix(数学:矩阵快速幂)
- hdu 5015 233 Matrix 矩阵快速幂 2014 ACM/ICPC Asia Regional Xi'an Online
- hdu 5015 233 Matrix(矩阵快速幂)
- hdu 5015 233 Matrix 线性序列构造矩阵快速幂
- hdu 5015 Matrix 233 矩阵快速幂
- hdu 5015 233 Matrix (矩阵快速幂)
- hdu 5015 233 Matrix (矩阵快速幂)
- hdu 5015 233 Matrix 矩阵快速幂
- HDU 5015 233 Matrix (数论——矩阵快速幂)
- hdu 5015 233 Matrix (递推 矩阵快速幂)
- HDU 5015 233 Matrix(矩阵快速幂)