设 从低到高 第 位的数字为 , 考虑 与后面 位组成逆序对的贡献,
先考虑 时的贡献, 为 , 其中每个数字出现的次数都相同,
再考虑 , 贡献变为 .
设 表示 右区间为 时 与 右区间 构成的贡献, 则 ,
设 位 无限制地填数 产生的总逆序对为 , 则 .
设当前位置为 , 上界为 , 选择的数字为 , 是初值为 的变量,
最高位为 , 表示 从 最高位 到 第 位 数字出现的次数,
表示从 第 位 到 位 的数字转化为十进制后的值,
现在按位 从低到高 进行处理,
-
, 总共有 个符合条件的 , 枚举 ,
- 内部的贡献,
- 与 构成的贡献:
- 与 构成的贡献:
- 与 构成的贡献:
所以该情况的总贡献为 , 累计进 .
-
, 考虑计算 与前面原数位产生的逆序对贡献, 贡献为 , 累加进 .
#include<bits/stdc++.h>
using namespace std;
#define reg register
typedef long long ll;
const int maxn = 500005;
const int mod = 998244353;
int T;
int len[2];
int g[maxn];
int pw[maxn];
int A[2][maxn];
int Tong[maxn];
int f[11][maxn];
char Cmp_1[maxn];
char Cmp_2[maxn];
void Init(){
pw[0] = 1; for(reg int i = 1; i < maxn; i ++) pw[i] = 10ll*pw[i-1] % mod;
for(reg int j = 0; j < maxn; j ++)
for(reg int i = 0; i <= 9; i ++) f[i][j] = 1ll*pw[j]*i % mod *(j+1) % mod;
for(reg int i = 1; i < maxn; i ++){
g[i] = 10ll*g[i-1] % mod;
for(reg int j = 0; j <= 9; j ++) g[i] = (g[i] + f[j][i-1]) % mod;
}
}
int Solve(int fl){
if(!len[fl]) return 0;
ll res = 0;
for(reg int i = 0; i < len[fl]; i ++) Tong[A[fl][i]] ++;
int suf = 0;
for(reg int i = 0; i < len[fl]; i ++){
int lim = A[fl][i]; Tong[lim] --;
if(i){
res += 1ll*lim*g[i-1] % mod, res -= res>=mod?mod:0;
for(reg int x = 0; x < lim; x ++) res += f[x][i-1], res -= res>=mod?mod:0;
for(reg int j = 0; j <= 9; j ++) res += 1ll*lim*Tong[j]%mod*f[j][i-1] % mod, res -= res>=mod?mod:0;
}
/*
for(reg int x = 0; x < lim; x ++)
for(reg int j = x+1; j <= 9; j ++) res += 1ll*pw[i]*Tong[j] % mod, res %= mod;
*/
for(reg int j = 1; j <= 9; j ++) res += (std::min(j-1, lim-1)+1ll)*Tong[j]%mod*pw[i]%mod, res -= res>=mod?mod:0;
for(reg int j = lim+1; j <= 9; j ++) res += (1ll*suf + 1) * Tong[j] % mod, res -= res>=mod?mod:0;
suf = (suf + (1ll*lim*pw[i]%mod)) % mod;
}
return res;
}
int main(){
Init(); int fuck;
scanf("%d%d", &T, &fuck);
while(T --){
scanf("%s%s", Cmp_1, Cmp_2);
len[0] = strlen(Cmp_1), len[1] = strlen(Cmp_2);
for(reg int i = 0; i < len[0]; i ++) A[0][i] = Cmp_1[len[0]-i-1] - '0';
for(reg int i = 0; i < len[1]; i ++) A[1][i] = Cmp_2[len[1]-i-1] - '0';
A[0][0] --; int t = 0;
while(A[0][t] < 0) A[0][t] += 10, A[0][++ t] --;
if(!A[0][len[0]-1]) len[0] --;
printf("%d
", (Solve(1) - Solve(0) + mod) % mod);
}
return 0;
}