解题思路:
用dp记录,一位以为算过去,一个数最高只有12位,不用担心超时问题
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <stdlib.h>
using namespace std;
#define LL __int64
LL dp[15][15];
int ai[15];
void init(int l,int m)
{
for(int i=0;i<=9;i++) dp[1][i]=1;
for(int i=2;i<=l+1;i++)
{
for(int j=0;j<=9;j++)
{
for(int k=0;k<=9;k++)
{
if(abs(j-k)>=m) dp[i][j]+=dp[i-1][k];
}
}
}
}
int cal(LL x,int m)
{
memset(ai,0,sizeof(ai));
int l=0,t,n=x;
LL sum=0;
while(n)
{
ai[++l] = n%10;
n/=10;
}
for(int i=1;i<l;i++)
{
for(int j=1;j<=9;j++) sum+=dp[i][j];
}
for(int i=1;i<ai[l];i++) sum+=dp[l][i];
for(int i=l-1;i>=1;i--)
{
for(int j=0;j<ai[i];j++)
{
if(abs(j-ai[i+1])>=m) sum+=dp[i][j];
}
if(abs(ai[i]-ai[i+1])<m) break;
}
return sum;
}
int main()
{
int t;
cin>>t;
while(t--)
{
LL a,b,m;
memset(dp,0,sizeof(dp));
cin>>a>>b>>m;
int k=0,n=b;
while(n)
{
n/=10;
k++;
}
init(k,m);
LL sum = cal(b+1,m)-cal(a,m);
cout<<sum<<endl;
}
return 0;
}