解题思路:怎么都没想到题目描述里的233是有用的,可以发现a[1]=23+1+f[1],a[2]=233+2+f[2],a[3]=2333+3+f[3],所以令: a[x]=g[x]+h[x]+f[x]那么: h[x]=h[x−1]+1,g[x]=g[x−1]*10+3
得到一系列递推式:f[x]=A*f[x-1]+B*f[x−2],h[x]=h[x-1]+1,g[x]=g[x-1]*10+3,,a[x]=g[x]+h[x]+f[x],s[x]=s[x-1]+a[x],ans[x]=ans[x-1]+s[x]
然后就可以构造矩阵,用矩阵快速幂求解
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
#include <set>
#include <stack>
#include <map>
#include <climits>
using namespace std;
#define LL long long
const int INF = 0x3f3f3f3f;
struct Matrix
{
LL v[15][15];
Matrix()
{
memset(v, 0, sizeof v);
}
} dan;
LL a, b, ans1, ans2, f2, mod, l, r;
Matrix mul(Matrix a, Matrix b, int d)
{
Matrix ans;
for (int i = 1; i <= d; i++)
{
for (int j = 1; j <= d; j++)
{
for (int k = 1; k <= d; k++)
{
ans.v[i][j] = ans.v[i][j] + (a.v[i][k] * b.v[k][j]) % mod;
ans.v[i][j] %= mod;
}
}
}
return ans;
}
Matrix pow(Matrix a, LL k, int d)
{
Matrix ans = dan;
while (k)
{
if (k & 1) ans = mul(ans, a, d);
k >>= 1;
a = mul(a, a, d);
}
return ans;
}
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
Matrix x, ans;
scanf("%lld %lld %lld %lld %lld", &a, &b, &l, &r, &mod);
f2 = (b%mod * 1995 + a%mod * 1129) % mod;
dan.v[1][1] = f2;
dan.v[1][2] = (a%mod*f2 + b%mod * 1129) % mod;
dan.v[1][3] = 2333; dan.v[1][4] = 3;
dan.v[1][5] = 235 + f2;
dan.v[1][6] = 3150;
dan.v[1][7] = 1997;
dan.v[1][8] = 1;
x.v[2][1] = 1;
x.v[1][2] = b, x.v[2][2] = a;
x.v[3][3] = 10, x.v[8][3] = 3;
x.v[4][4] = 1, x.v[8][4] = 1;
x.v[2][5] = 1, x.v[3][5] = 1, x.v[4][5] = 1;
x.v[5][6] = x.v[6][6] = x.v[6][7] = x.v[7][7] = x.v[8][8] = 1;
l--;
if (l == -1) ans1 = 0;
else if (l == 0) ans1 = 1997;
else
{
ans = pow(x, l, 8);
ans1 = ans.v[1][7];
}
if (r == 0) ans2 = 1997;
else
{
ans = pow(x, r, 8);
ans2 = ans.v[1][7];
}
printf("%lld\n", (ans2 - ans1 + mod) % mod);
}
return 0;
}