题目大意:输入n,m,计算123456…n%m
题解:递推式: f[n]=f[n−1]∗10k+n
A= [fi−1i−11]
B= ⎡⎣⎢10k11011001⎤⎦⎥
C= [fii1]
C=AB,分段矩阵乘法
我的收获:常系数线性递推……
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(x,y) for(int x=0;x<y;x++)
const int N=3;
ll n,P;
struct Matrix{
int x,y;ll v[N][N];
ll *operator [] (int x){return v[x];}
Matrix(int _x,int _y,int w=0){
x=_x,y=_y;
rep(i,N) rep(j,N) v[i][j]=(i==j)?w:0;
}
};
Matrix operator * (Matrix a,Matrix b){
Matrix c(a.x,b.y);
rep(i,a.x) rep(j,b.y) rep(k,a.y) c[i][j]=(c[i][j]+a[i][k]*b[k][j])%P;
return c;
}
Matrix operator ^ (Matrix a,ll b){
Matrix c(a.x,a.y,1);
for(;b;b>>=1,a=a*a)
if(b&1) c=c*a;
return c;
}
Matrix ans(1,3),b(3,3);
void work()
{
for(ll i=10;;i*=10)
{
b[0][0]=i%P;
ll c=i<=n?(i/10*9):(n-i/10+1);
ans=ans*(b^c);
if(i>n) break;
}
printf("%lld\n",ans[0][0]);
}
void init()
{
cin>>n>>P;
ans[0][2]=1;
for(int i=0;i<N;i++)
for(int j=0;j<=i;j++)
b[i][j]=1;
}
int main()
{
init();
work();
return 0;
}