tabris有一个习惯,无聊的时候就会数圈圈,无论数字还是字母。
现在tabris更无聊啦,晚上睡不着觉就开始数羊,从a只数到b只。
顺便还数了a到b之间有多少个圈。
但是tabris笨啊,虽然数羊不会数错,但很可能数错圈的个数。
但是tabris很难接受自己笨这个事实,所以想问问你他一共应该数出多少个圈,这样tabris才好判断他到底笨不笨啊。 

输入描述:

输入一个T,表示数据组数
每组测试数据包含两个正整数a,b。
T∈[1,50]
a,b∈[1,106]

输出描述:

每组数据输出结果,并换行。
示例1

输入

复制 11 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 1 100
11
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
1 100

输出

复制 0 0 0 1 0 1 0 2 1 1 111
0
0
0
1
0
1
0
2
1
1
111

备注:

数字的圈的个数请根据样例自行理解。

思路:首先,定义一个常量数组 c,用于存储数字 0 到 9 的权重。例如,c[0] = 1 表示数字 0 的权重是 1,c[1] = 0 表示数字 1 的权重是 0,依此类推。其次定义两个数组 x 和 s,其中 x[i] 用于存储数字 i 的权重,s[i] 用于存储从 1 到 i 的所有数字的权重之和。在 init() 函数中,遍历从 1 到 N 的每一个数字 i,计算其权重并存储在 x[i] 中。权重的计算方法是通过检查数字 i 的每一位,根据 c 数组中对应位置的值来累加权重。然后,计算前缀和数组 s,其中 s[i] = s[i-1] + x[i],这样 s[i] 就包含了从 1 到 i 的所有数字的权重之和。最后使用前缀和数组 s 来快速计算从 a 到 b 的所有数字的权重之和。具体来说,s[b] - s[a-1] 可以得到结果,因为 s[b] 包含了从 1 到 b 的权重之和,而 s[a-1] 包含了从 1 到 a-1 的权重之和,两者的差值就是从 a 到 b 的权重之和。

#include<iostream>
using namespace std;

const int N = 1e6;
int c[10]={1,0,0,0,1,0,1,0,2,1};
int x[N+1],s[N+1];

void init()
{
    for(int i = 1;i<=N;i++)
    {
        int t = i;
        while(t)
        {
            x[i]+=c[t%10];
            t/=10;
        }
    }
    for(int i = 1;i<=N;i++) s[i]=s[i-1]+x[i];
}

int main()
{
    int n;
    cin>>n;
    init();
    while(n--)
    {
        int a,b;
        cin>>a>>b;
        cout<<s[b]-s[a-1]<<endl;;
    }
    return 0;
}