题目链接: https://www.luogu.com.cn/problem/P3216
题意十分简单。
令
f
(
n
)
f(n)
f(n)表示
C
o
n
c
a
t
e
n
a
t
e
(
n
)
Concatenate(n)
Concatenate(n)
m
o
d
mod
mod
m
m
m 的值
则设
n
n
n的位数为
S
S
S
则:
f
(
n
)
=
S
∗
f
(
n
−
1
)
+
n
f(n)=S * f(n-1)+n
f(n)=S∗f(n−1)+n
(
m
o
d
(mod
(mod
m
)
m)
m)
发现这是一个线性递推式,想到
n
,
m
n,m
n,m特别大,考虑矩阵乘法
令
g
(
n
)
=
n
g(n)=n
g(n)=n %
m
m
m
[
f
(
n
)
g
(
n
)
1
]
=
[
f
(
n
−
1
)
g
(
n
−
1
)
1
]
∗
[
S
0
0
1
1
0
1
1
1
]
\begin{bmatrix} f(n) \\ g(n) \\ 1 \end{bmatrix}=\begin{bmatrix} f(n-1) \\ g(n-1) \\ 1 \end{bmatrix}* \begin{bmatrix} S & 0 & 0 \\ 1 & 1 &0 \\ 1 & 1 &1 \end{bmatrix}
⎣⎡f(n)g(n)1⎦⎤=⎣⎡f(n−1)g(n−1)1⎦⎤∗⎣⎡S11011001⎦⎤
对
n
n
n内的数分位数求解即可
时间复杂度
O
(
l
o
g
n
)
O(log n)
O(logn) 以10为底
C o d e Code Code
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int MAXI=4;
struct Matrix{
int m,n;
int g[MAXI+10][MAXI+10];
Matrix(){m=0,n=0;memset(g,0,sizeof(g));}
}I;
int n,Mod;
Matrix operator * (const Matrix &A,const Matrix &B){
Matrix C;
C.m=A.m,C.n=B.n;
for (register int i=1;i<=C.m;++i)
for (register int j=1;j<=C.n;++j)
for (register int k=1;k<=A.n;++k)
C.g[i][j]=(C.g[i][j]+A.g[i][k]*B.g[k][j])%Mod;
return C;
}
Matrix fastpow(Matrix,int);
Matrix make(int);
signed main(){
//freopen ("std.in","r",stdin);
//freopen ("std.out","w",stdout);
scanf("%lld%lld",&n,&Mod);
I.m=I.n=3;
for (register int i=1;i<=MAXI;++i) I.g[i][i]=1;
int k=1,p;
Matrix ans=I;
for (register int i=1;i<=n;i*=10){
Matrix A=make(i*10);
if (n/10<i) p=n-i+1;
else p=i*9;
ans=ans*fastpow(A,p);
}
Matrix V;
V.m=1,V.n=3,V.g[1][3]=1;
V=V*ans;
printf("%lld\n",V.g[1][1]);
return 0;
}
Matrix fastpow(Matrix x,int p){
Matrix ans=I;
while (p){
if (p&1) ans=ans*x;
p>>=1;
x=x*x;
}
return ans;
}
Matrix make(int x){
Matrix A=I;
A.g[1][1]=x%Mod;
A.g[2][1]=A.g[3][1]=A.g[3][2]=1;
return A;
}