题意: 制定区间内,求出区间内所有数中某个数字出现的次数。
思路: 典型的数位统计问题, 先预处理一下,
f[ i, j ] 用来表示 j x 10i ~ ( j + 1 ) x 10i-1 的范围内p出现的次数
然后计算从0到区间的两个临界值包含的数值的个数,逐位统计。
#include<bits/stdc++.h>
#define LL long long
using namespace std;
LL f[15][15];
LL cont(int k, int d) {
if (k > 1) d--;
LL res = 0;
for (int i = 0; i <= d; i++)
res += f[k][i];
return res;
}
void pre(int p){
LL up = 1;
for (int i = 1; i <= 10; i++) {
LL sum = 0;
for (int j = 0; j < 10; j++)
sum += f[i-1][j];
for (int j = 0; j < 10; j++){
f[i][j] = sum;
if (j==p) f[i][p]+=up;
}
up*=10;
}
}
LL countDigit(int n, int p) {
if (n<=0) return 0;
int k=0;
int num = n,dig = 1;
LL res = 0, cnt = 0;
while (num > 0) {
int d = num % 10;
k++;
cnt += cont(k, d);
if (d == p && k>1) cnt += res+1;
num /= 10;
res = d*dig + res;
dig *= 10;
}
return cnt;
}
int main()
{
int T;
scanf("%d",&T);
while(T--){
memset(f,0,sizeof(f));
int a,b,p;
scanf("%d%d%d",&a,&b,&p);
pre(p);
LL ans=countDigit(b,p)-countDigit(a-1,p);
printf("%lld\n",ans);
}
return 0;
}