题目描述:

题意:
F(n)={F(n)=F(n)=n,∑i=09ai×F(n−i−1),n<10n≥10
∴ans=An−9×B
∵⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧F(n)F(n−1)F(n−2)F(n−3)F(n−4)F(n−5)F(n−6)F(n−7)F(n−8)F(n−9)⎭⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎬⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎫=⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧a0100000000a1010000000a2001000000a3000100000a4000010000a5000001000a6000000100a7000000010a8000000001a9000000000⎭⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎬⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎫n−9×⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧F(9)F(8)F(7)F(6)F(5)F(4)F(3)F(2)F(1)F(0)⎭⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎬⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎫
∴B=⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧9876543210⎭⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎬⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎫,A=⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧a0100000000a1010000000a2001000000a3000100000a4000010000a5000001000a6000000100a7000000010a8000000001a9000000000⎭⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎬⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎫
参考代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
#define ll long long
#define endl '\n'
#define mem(a,b) memset(a,b,sizeof(a))
const ll N=10;
ll k,mod;
struct Matrix {
ll m[N][N];
Matrix() {
mem(m, 0);
}
void init() {
for (int i = 0; i < N; i++)m[i][i] = 1;
}
Matrix operator+(const Matrix &b) const {
Matrix c;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
c.m[i][j] = (m[i][j] + b.m[i][j]) % mod;
}
}
return c;
}
Matrix operator*(const Matrix &b) const {
Matrix c;
mem(c.m,0);
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
for (int k = 0; k < N; k++) {
c.m[i][j] = (c.m[i][j] + (m[i][k] * b.m[k][j]) % mod) % mod;
}
}
}
return c;
}
Matrix operator^(const ll &t) const {
Matrix ans, a = (*this);
ans.init();
ll n = t;
while (n) {
if (n & 1) ans = ans * a;
a = a * a;
n >>= 1;
}
return ans;
}
};
int main() {
while (~scanf("%lld%lld", &k, &mod)) {
Matrix A;
mem(A.m, 0);
Matrix B;
mem(B.m, 0);
for (int i = 0; i < N; i++) {
scanf("%lld", &A.m[0][i]);
}
if (k < 10) {
printf("%lld\n", A.m[0][k] % mod);
continue;
}
for(int i=0;i<N;i++){
B.m[9-i][0]=i;
}
for (int i = 1; i < N; i++) {
A.m[i][i - 1] = 1;
}
Matrix ans = (A ^ (k - 9)) * B;
printf("%lld\n", ans.m[0][0] % mod);
}
return 0;
}