B吉利数字
时限:1s
【题目描述】
算卦大湿biboyouyun最近得出一个神奇的结论,如果一个数字,它的各个数位相加能够被10整除,则称它为吉利数。现在叫你计算某个区间内有多少个吉利数字。
【输入】
第一行为样例个数N。接下来N行,每一行代表一个输入样例,每个输入样例有2个数,分别代表某个区间的起点a和终点b。
注意所求区间为[a,b],1<=a<=b<=10^9
【输出】
N行。对于第x个输入样例,在第x行输入该样例所对应的结果。
【输入样例】
2
1 10
1 20
【输出样例】
0
1
【Hint】1-10之内无幸运数,1-20内只有19 这1个幸运数
------------------------------------------------------------------------------------
数位dp入门题。
一开始参考了数位dp入门ppt的非递归写法,先打个表再计算,结果YY了半天还是错了T^T
这里有个用dfs写法写数位dp的模板:
http://www.cnblogs.com/jffifa/archive/2012/08/17/2644847.html
代码:
1 #include <stdio.h> 2 #include <string.h> 3 int dp[100][100]; 4 int dig[100]; 5 6 int dfs(int i,int s,bool e) 7 { 8 if (!i) return (s==0?1:0); 9 if ((!e)&&(dp[i][s]!=-1)) return dp[i][s]; 10 int res=0; 11 int u=e?dig[i]:9; 12 for (int q=0;q<=u;q++) 13 res+=dfs(i-1,(s+q)%10,e&&q==u); 14 if (!e) dp[i][s]=res; 15 return res; 16 } 17 18 int f(int n) 19 { 20 int len = 0; 21 while(n) 22 { 23 dig[++len] = n % 10; 24 n /= 10; 25 } 26 return dfs(len,0,true); 27 } 28 29 int main() 30 { 31 int a,b,T; 32 memset(dp,-1,sizeof(dp)); 33 scanf("%d",&T); 34 while (T--) 35 { 36 scanf("%d %d",&a,&b); 37 printf("%d\n",f(b)-f(a-1)); 38 } 39 return 0; 40 }