• Codeforces 932.B Recursive Queries


    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.

    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
    ",sum[r][k] - sum[l - 1][k]);
        }
    
        return 0;
    }
  • 相关阅读:
    jQueryEasyUI
    AJAX
    SWFUpload批量上传插件
    jQuery工具函数
    jQuery之Jcrop
    jQuery插件之jqzoom
    jQuery插件之artDialog
    jQuery插件之ajaxFileUpload
    jQuery插件之Cookie
    jQuery插件之Form
  • 原文地址:https://www.cnblogs.com/zbtrs/p/8450154.html
Copyright © 2020-2023  润新知