神奇的魔法数
1000ms
32768KB
This problem will be judged on FZU. Original ID:
1896
64-bit integer IO format: %I64d Java class name: Main
64-bit integer IO format: %I64d Java class name: Main
Font Size:
Input
Output
Sample Input
7 1 10 2 1 20 3 1 100 0 10 20 4 20 30 5 1 10 9 11 100 9
Sample Output
9 15 100 5 3 9 1
Source
#include <iostream>
#include<stdio.h>
#include<string.h>
#include<cmath>
#include<queue>
#include<string>
#include<algorithm>
using namespace std;
int dp[11][10]; /// 位数 首位
int m;
void fun()
{
memset(dp,0,sizeof(dp));
for(int i=0; i<=9; i++)
dp[1][i]=1;
for(int i=2; i<=10; 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 slove(int x)
{
int len=0,sum=0,bit[15];
while(x)
{
bit[++len]=x%10;
x=x/10;
}
for(int i=1; i<len; i++) ///处理最高位的后面位 len-1 位
for(int j=1; j<10; j++)
sum+=dp[i][j];
for(int i=1; i<bit[len]; i++) /// 处理最高位 下不同的首位
sum+=dp[len][i];
for(int i=len-1; i>0; i--) /// 在处理相邻为
{
for(int j=0; j<bit[i]; j++)
if(abs(j-bit[i+1])>=m)
sum+=dp[i][j];
if(abs(bit[i]-bit[i+1])<m)
break;
}
return sum;
}
int main()
{
int t,a,b;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&a,&b,&m);
fun();
printf("%d\n",slove(b+1)-slove(a));
}
return 0;
}