HDU 1757 A Simple Math Problem (矩阵快速幂)

来源:互联网 发布:java能做什么游戏 编辑:程序博客网 时间:2024/05/16 16:22

HDU 1757 A Simple Math Problem (矩阵快速幂)

ACM

题目地址:HDU 1757 A Simple Math Problem

题意: 
If x < 10 f(x) = x. 
If x >= 10 f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + …… + a9 * f(x-10); 
问f(k)%m的值。

分析: 
裸矩阵快速幂,式子都给你了,跟HDU 2604 Queuing (矩阵快速幂)一样,试着做看看吧。

代码

/**  Author:      illuz <iilluzen[at]gmail.com>*  Blog:        http://blog.csdn.net/hcbbt*  File:        1757.cpp*  Create Date: 2014-08-03 09:24:45*  Descripton:  Matrix quick power */#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define repf(i,a,b) for(int i=(a);i<=(b);i++)typedef long long ll;const int N = 20;const int SIZE = 20;// max size of the matrixll k, MOD;struct Mat{int n;ll v[SIZE][SIZE];// value of matrixMat(int _n = SIZE) {n = _n;memset(v, 0, sizeof(v));}void init(ll _v) {repf (i, 0, n - 1)v[i][i] = _v;}void output() {repf (i, 0, n - 1) {repf (j, 0, n - 1)printf("%lld ", v[i][j]);puts("");}puts("");}} a, b;Mat operator * (Mat a, Mat b) {Mat c(a.n);repf (i, 0, a.n - 1) {repf (j, 0, a.n - 1) {c.v[i][j] = 0;repf (k, 0, a.n - 1) {c.v[i][j] += (a.v[i][k] * b.v[k][j]) % MOD;c.v[i][j] %= MOD;}}}return c;}Mat operator ^ (Mat a, ll k) {Mat c(a.n);c.init(1);while (k) {if (k&1) c = a * c;a = a * a;k >>= 1;}return c;}void init() {// initrepf (i, 0, 9)a.v[9 - i][0] = i;repf (i, 0, 8)b.v[i + 1][i] = 1;}void solve() {// readrepf (i, 0, 9)scanf("%lld", &b.v[0][i]);Mat c;if (k <= 9) {printf("%lld\n", k % MOD);} else {c = b ^ (k - 9);//c.output();c = c * a;printf("%lld\n", c.v[0][0] % MOD);}}int main() {init();while (~scanf("%lld%lld", &k, &MOD)) {solve();}return 0;}


0 0
原创粉丝点击