模板总结归纳:
typedef long long ll;
const int maxn = 110;
const int MOD = 1e9+7;
#define mod(x) ((x)%MOD)
int n;
struct mat{
int m[maxn][maxn];
}unit;
mat operator * (mat a, mat b)
{
mat ret;
ll x;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
{
x = 0;
for(int k = 0; k < n; k++)
x += mod((ll)a.m[i][k] * b.m[k][j]);
ret[i][j] = x;
}
return ret;
}
mat pow_mat(mat a, ll n)
{
mat ret = unit;
while(n)
{
if(n & 1) ret = ret * a;
a = a * a;
n >>= 1;
}
return ret;
}
void init_unit()
{
for(int i 0; i < maxn; i++)
unit.m[i][i] = 1;
return ;
}
实战模板题 :HDU 1757 A Simple Math Problem
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
typedef long long ll;
const int maxn = 10;
int MOD;
#define mod(x) ((x)%MOD)
int n = 10;
struct mat{
int m[maxn][maxn];
}unit;
mat operator * (mat a, mat b)
{
mat ret;
ll x;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
{
x = 0;
for(int k = 0; k < n; k++)
x += mod((ll)a.m[i][k] * b.m[k][j]);
ret.m[i][j] = mod(x);
}
return ret;
}
mat pow_mat(mat a, ll n)
{
mat ret = unit;
while(n)
{
if(n & 1) ret = ret * a;
a = a * a;
n >>= 1;
}
return ret;
}
void init_unit()
{
for(int i = 0; i < maxn; i++)
unit.m[i][i] = 1;
return ;
}
int main()
{
ll k;
while(cin >> k >> MOD)
{
mat a, b;
memset(a.m, 0, sizeof(a.m));
for(int i = 0; i < 10; i++)
cin >> a.m[0][i];
if(k <= 9)
{
cout << k << endl;
continue;
}
for(int i = 1; i < 10; i++)
a.m[i][i - 1] = 1;
init_unit();
a = pow_mat(a,k + 1 - 10);
for (int i = 0; i < 10; i++) {
b.m[i][0] = 9 - i;
for (int j = 1; j < 10; j++)
b.m[i][j] = 0;
}
b = a * b;
cout << b.m[0][0] << endl;
}
return 0;
}
具体问题分析可以参考:
其他博客的讲解