可以根据 f(1) ---- f(2)发现加速矩阵
然后可以根据矩阵快速幂写
代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 100019;
struct matrix
{
ll a[9][9];
};
//这里的mul和pow还有matrix要结合起来用,矩阵快速幂,题目中是有mod的
matrix mul(matrix x, matrix y) {//矩阵乘法
matrix c;
for (int i = 0; i<9; i++)
{
for (int j = 0; j<9; j++)
{
c.a[i][j] = 0;
for (int k = 0; k<9; k++)
c.a[i][j] = (c.a[i][j] % mod + ((x.a[i][k] % mod) * (y.a[k][j] % mod)) % mod) % mod;//这里需要mod
}
}
return c;
}
ll pow(matrix x, ll n) {//快速幂
matrix ans;
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
if(i==j) ans.a[i][j]=1;
else ans.a[i][j]=0;
}
}
while (n)
{
if (n & 1)
ans = mul(ans, x);
x = mul(x, x);
n >>= 1;
}
matrix ab;
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
if(j==0) ab.a[i][j]=9-i;
else ab.a[i][j]=0;
}
}
ab = mul(ab,ans);
ll dd = 0;
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
if(i==j) dd=(dd+ab.a[i][j])%mod;
}
//cout<<endl;
}
return (dd)%mod;
}
int main() {
ll n, t;
matrix base;
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
if(j>=i) base.a[i][j]=1;
else base.a[i][j]=0;
}
}
cin>>n;
cout << pow(base, n-1) << endl;
return 0;
}


京公网安备 11010502036488号