题目:
http://acm.hdu.edu.cn/showproblem.php?pid=1757
题意:
有函数f(x)。当x<10时,f(x) = x;当x>=10,f(x) = a0 * f(x-1) + a1 * f(x-2) +…+a9 * f(x-10)。现在给出a0 ~ a9,求f(x)
思路:
说起来惭愧,现在才会矩阵快速幂,以前一直不懂得怎么构造矩阵。。。首先k<10的话,直接输出k,否则,构造一个矩阵,矩阵的第一列依次为a0~a9,然后f[i-1][i] = 1,求矩阵的(k-9)次幂,然后用f(9)~f(0)依次构造一个矩阵,乘以之前求出的矩阵的幂,输出f[0][0]即可
#include <bits/stdc++.h>
using namespace std;
const int N = 10;
int MOD;
struct matrix
{
int f[10][10];//矩阵主体
int row, col;//矩阵的行和列
void init(int row, int col)
{
this->row = row, this->col = col;
memset(f, 0, sizeof f);
}
friend matrix operator* (matrix a, matrix b) //矩阵乘法,重载*运算符
{
matrix c;
c.row = a.row, c.col = b.col;
memset(c.f, 0, sizeof c.f);
for(int i = 0; i < a.row; i++)
for(int j = 0; j < b.col; j++)
for(int k = 0; k < a.col; k++)
c.f[i][j] = (c.f[i][j] % MOD + a.f[i][k] * b.f[k][j] % MOD) % MOD;
return c;
}
};
matrix fast_pow(int n, matrix a)//快速幂
{
matrix b;
b.init(10, 10);
for(int i = 0; i < 9; i++) b.f[i][i] = 1;
while(n)
{
if(n & 1) b = b * a;
n >>= 1;
a = a * a;
}
return b;
}
int main()
{
int k;
matrix a;
while(~ scanf("%d%d", &k, &MOD))
{
a.init(10, 10);
for(int i = 0; i < 10; i++) scanf("%d", &a.f[i][0]);
if(k < 10) printf("%d\n", k);
else
{
for(int i = 1; i < 10; i++) a.f[i-1][i] = 1;
a = fast_pow(k - 9, a);
matrix b;
b.init(1, 10);
for(int i = 0; i < 10; i++) b.f[0][i] = 9 - i;
b = b * a;
printf("%d\n", b.f[0][0]);
}
}
return 0;
}