【题目描述 - Problem Description】
杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer)。
杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众。
不吉利的数字为所有含有4或62的号码。例如:
62315 73418 88914
都属于不吉利号码。但是,61152虽然含有6和2,但不是62连号,所以不属于不吉利数字之列。
你的任务是,对于每次给出的一个牌照区间号,推断出交管局今次又要实际上给多少辆新的士车上牌照了。
【输入 - Input】 |
【输出 - Output】 |
输入的都是整数对n、m(0<n≤m<1000000),如果遇到都是0的整数对,则输入结束。 |
对于每个整数对,输出一个不含有不吉利数字的统计个数,该数值占一行位置。 |
【输入样例 - Sample Input】 |
【输出样例 - Sample Output】 |
1 100 0 0 |
80 |
【__】
因为自己DP只会01背包,所以听说这个是数位DP就去试试。
然后刚看完题目就条件反射想用二进制做,不过还是被理智打断成功。
然后……就弄了个应该是数位DP的东西吧…………(面向打野编程)
【代码 C++】
1 #include<cstdio> 2 #define mx 1000005 3 int data[mx]; 4 int log10cb(int i){ 5 int w = 0; 6 while (i) ++w, i /= 10; 7 for (i = 1; w--; i *= 10); 8 return i; 9 } 10 void mark(int s){ 11 int i, j, temp, w; 12 for (w = 1; s < mx; s *= 10, w *= 10){ 13 temp = log10cb(s); 14 for (i = s; i < mx; i += temp){ 15 for (j = 0; j < w; ++j) ++data[i + j ]; 16 } 17 } 18 } 19 void rdy(){ 20 mark(4), mark(62); 21 for (int i = 0, s = 0; i < mx; ++i){ 22 if (data[i]) ++s; 23 data[i] = s; 24 } 25 } 26 int main(){ 27 int l, r; 28 rdy(); 29 while (~scanf("%d%d", &l, &r)){ 30 if (l + r == 0) break; 31 if (l > r) l ^= r, r ^= l, l ^= r; 32 --l; 33 printf("%d ", r - l - data[r] + data[l]); 34 } 35 return 0; 36 }
HDU 2089