游客 Signup | Login
中文 | En

3989 - 好奇的果沫

可怜的果沫在寒假的时候去考科目三,他坐在候车室,盯着屏幕上滚动的考场车序号,不一会,他发现所有的序列中,没有任何一个序列包含“4”这一位。于是好奇的果沫想知道是如何实现这一功能的,机智的你们能帮他解决这个问题么?

Input

第一行输入2个整数,t、k(0 < t < 10,0 < k < 100)表示有t组测试数据,第二行输入给定2个整数n、m(0 < n ≤ m < 100000000)。

Output

输出t行,每行一个整数,为区间 [n, m] 中不含 k 的数的个数

Examples

Input

1 4
1 100

Output

81

Solution C++

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>
#include <cmath>
#include <string>
#include <set>
#include <map>
#define NBIT 9
#define getten(a) (a/10)
#define getge(a) (a%10)
#define isten(a) (a >= 10)

using namespace std ;

int f[15][15], p ;
int dig[15] ;

void init ()
{
	memset (f, 0, sizeof(f)) ;
	f[0][0] = 1 ;
	for (int i=1; i<=NBIT; i++)
		for (int j=0; j<=9; j++)
			for (int k=0; k<=9; k++)
				if ((!isten(p) && j != getge(p)) || (isten(p) && !(j == getten(p) && k == getge(p))))
					f[i][j] += f[i-1][k] ;
}

int getdig (int n)
{
	int len = 0 ;
	while (n)
	{
		dig[++len] = n % 10 ;
		n /= 10 ;
	}
	
	return len ;
}

int getcount (int n)
{
	n++ ;
	
	int len = getdig (n) ;
	int ans = 0 ;
	for (int i=len; i>0; i--)
	{
		for (int j=0; j<dig[i]; j++)   //个位数的最后一位没统计到,所以统计的为[0, n-1],要+1
			if ((!isten(p) && j != getge(p)) || (isten(p) && !(i < len && dig[i+1] == getten(p) && j == getge(p))))
				ans += f[i][j] ;
		if ((!isten(p) && dig[i] == getge(p)) || (isten(p) && (i < len && dig[i+1] == getten(p) && dig[i] == getge(p))))
			break ;
	}
	
	return ans ;
}

int main()
{
	int n, m, t ;
	scanf ("%d%d", &t, &p) ;
	init () ;
	
	for (int i=0; i<t; i++)
	{
		scanf ("%d%d", &n, &m) ;
		printf ("%d\n", getcount(m) - getcount(n-1)) ;
	}

	return 0 ;
}
Time Limit 1 second
Memory Limit 128 MB
Discuss Stats
上一题 下一题