1. 程式人生 > >dfs打表 C. Classy Numbers

dfs打表 C. Classy Numbers

-c cout nbsp mat begin cti oar cpp class

C. Classy Numbers

C. Classy Numbers time limit per test 3 seconds memory limit per test 256 megabytes input standard input output standard output

Let‘s call some positive integer classy if its decimal representation contains no more than 33 non-zero digits. For example, numbers 44, 200000200000, 1020310203 are classy and numbers

42314231, 102306102306, 72774200007277420000 are not.

You are given a segment [L;R][L;R]. Count the number of classy integers xx such that LxRL≤x≤R.

Each testcase contains several segments, for each of them you are required to solve the problem separately.

Input

The first line contains a single integer TT (

1T1041≤T≤104) — the number of segments in a testcase.

Each of the next TT lines contains two integers LiLi and RiRi (1LiRi10181≤Li≤Ri≤1018).

Output

Print TT lines — the ii-th line should contain the number of classy integers on a segment [Li;Ri][Li;Ri].

Example input Copy
4
1 1000
1024 1024
65536 65536
999999 1000001
output Copy
1000
1
0
2

題意:找出區間[L, R]之間最多有三位是非零數字的十進制數的個數;

思路:用構造出所有的滿足題意的數,然後排序,二分找;

也可數位DP

/***********************************************/
ll a,b,n;
vector<ll>V;

void dfs(ll x,int oo,int len)
{
	V.push_back(x);
	if(len==18) return ;
	dfs(x*10,oo,len+1);
	if(oo<3)
	for(int i=1;i<=9;i++) dfs(x*10+i,oo+1,len+1);
}

int main() 
{
	for(ll i=1;i<=9;i++) {
		dfs(i,1,1);
	}
	V.push_back(1e18);
	sort(V.begin(),V.end());
    scl(n);
    while(n--)
    {
    	ll ans=0;
    	scl2(a,b);
		ll l=lower_bound(V.begin(),V.end(),a)-V.begin();
		ll r=upper_bound(V.begin(),V.end(),b)-V.begin();
		cout<<r-l<<endl;
	}
    return 0;
}

  

dfs打表 C. Classy Numbers