B. Recursive Queries
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Let us define two functions f and g on positive integer numbers.

Codeforces 932.B Recursive Queries_i++

Codeforces 932.B Recursive Queries_i++_02

You need to process Q queries. In each query, you will be given three integers lr and k. You need to print the number of integers xbetween l and r inclusive, such that g(x) = k.

Input

The first line of the input contains an integer Q (1 ≤ Q ≤ 2 × 105) representing the number of queries.

Q lines follow, each of which contains 3 integers lr and k (1 ≤ l ≤ r ≤ 106, 1 ≤ k ≤ 9).

Output

For each query, print a single line containing the answer for that query.

Examples
input
4
22 73 9
45 64 6
47 55 7
2 62 4
output
1
4
0
8
input
4
82 94 6
56 67 4
28 59 9
39 74 4
output
3
1
1
5
Note

In the first example:

  • g(33) = 9 as g(33) = g(3 × 3) = g(9) = 9
  • g(47) = g(48) = g(60) = g(61) = 6
  • There are no such integers between 47 and 55.
  • g(4) = g(14) = g(22) = g(27) = g(39) = g(40) = g(41) = g(58) = 4

题目大意:f(x)的值是x非零数位的乘积.q组询问,每次问[l,r]之间的x,有多少g(x) = k;

分析:多组询问想到预处理,每次问个数想到前缀和,那么预处理一个前缀和就好了.

#include <cstdio>
#include <cmath>
#include <queue>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

typedef long long ll;

int q,a[1000010],sum[1000010][10];

int solve(int x)
{
    if (x < 10)
        return x;
    if (a[x])
        return a[x];
    int res = 1;
    while (x)
    {
        int temp = x % 10;
        if (temp != 0)
            res *= temp;
        x /= 10;
    }
    return a[x] = solve(res);
}

int main()
{
    scanf("%d",&q);
    for (int i = 1; i <= 1000000; i++)
    {
        if (i < 10)
            a[i] = i;
        else
            a[i] = solve(i);
    }
    for (int i = 1; i <= 1000000; i++)
    {
        for (int j = 1; j <= 9; j++)
            sum[i][j] += sum[i - 1][j];
        sum[i][a[i]]++;
    }
    while (q--)
    {
        int l,r,k;
        scanf("%d%d%d",&l,&r,&k);
        printf("%d\n",sum[r][k] - sum[l - 1][k]);
    }

    return 0;
}