CodeForces 932B Recursive Queries

Description

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

题意:

给定一个表达式,根据表达式求值。先输入q,代表有q次询问,接下来q行,分别为l,r,k。表示从l到r有多少个值为k的数字,输出一个整数

思路:

看数据量,q和l,r都很大,所以如果直接暴力会超时。所以要先求出每个数的值是多少。这里通过递归或者循环都能求出来,本人不习惯递归,使用循环求出。然后用二维数组,直接求出从1-i有多少个符合条件的数,二位数组的i代表从1到i有多少符合条件的,j代表的是结果,也就是k。所以求l到r之间等于k的就是ans[r][k] - ans[l-1][k]。具体看代码。

代码:

#include <bits/stdc++.h>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <string>
#include <queue>
#include <stack>
#include <map>
#include <set>

#define IO ios::sync_with_stdio(false);\
    cin.tie(0);    cout.tie(0);

typedef long long LL;
const long long INF = 0x3f3f3f3f;
const long long mod = 1e9+7;
const double PI = acos(-1.0);
const int maxn = 1100000;
const char week[7][10]= {"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};
const char month[12][10]= {"Janurary","February","March","April","May","June","July",
                           "August","September","October","November","December"
                          };
const int daym[2][13] = {{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
    {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
const int dir4[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
const int dir8[8][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}, {1, 1}, {-1, -1}, {1, -1}, {-1, 1}};

using namespace std;
using namespace std;

int n, k, ans[maxn][9], q, l, r;

int a[maxn];
void init()//将1-maxn的值求出来
{
    for(int i=1; i<=maxn; i++)
    {
        int sum=1;
        int ii=i;
        while(ii)
        {
            if(ii%10!=0)
                sum=sum*(ii%10);
            ii/=10;
        }
        int sum1=1;
        while(1)
        {
            if(sum<10)
            {
                a[i]=sum;
                break;
            }
            while(sum)
            {
                if(sum%10!=0)
                    sum1=sum1*(sum%10);
                sum/=10;
            }
            sum=sum1;
            sum1=1;
        }

    }
}

int main()
{
    init();
    for (int i = 1; i <= maxn; i++)//将每个数的结果加上
    {
        ans[i][a[i]]++;
    }
    for (int i = 1; i <= 9; i++)
        for (int j = 2; j <= maxn; j++)//将从1到j的等于i的数求出来。
            ans[j][i] += ans[j-1][i];
    cin >> q;
    while (q--)
    {
        cin >> l>> r>> k;
        cout <<ans[r][k] - ans[l-1][k]<<endl;
    }
}

原文地址:https://www.cnblogs.com/aiguona/p/8450080.html

时间: 2024-10-06 15:06:39

CodeForces 932B Recursive Queries的相关文章

前缀和的应用 CodeForces - 932B Recursive Queries

题目链接: https://vjudge.net/problem/1377985/origin 题目大意就是要你把一个数字拆开,然后相乘. 要求得数要小于9,否则递归下去. 这里用到一个递归函数: int f(int x) { if(x < 10) return x; int ans = 1; while(x) { if(x%10 != 0) ans *= x%10; else ans *= 1; x /= 10; } return f(ans); } 这个函数用来求得一个数字最终得到的那个k值

【ICM Technex 2018 and Codeforces Round #463 (Div. 1 + Div. 2, combined) B】Recursive Queries

[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 写个记忆化搜索. 接近O(n)的复杂度吧 [代码] #include <bits/stdc++.h> using namespace std; const int N = 1e6; int g[N+10]; int pre[N+10][20]; int f(int x){ int temp = 1; while (x){ if (x%10!=0) temp*=(x%10); x/=10; } return temp; } in

codeforces 245H H. Queries for Number of Palindromes(区间dp)

题目链接: codeforces 245H 题目大意: 给出一个字符串,询问任意区间内的回文子串的个数. 题目分析: 定义isPar[i][j]表示区间字符串[i,j]是否是回文,可以通过isPar[i+1][j-1]递推得到. 定义dp[i][j]表示及区间[i,j]内的回文子串的个数,转移方程如下: dp[i][j]=dp[i+1][j]+dp[i][j?1]?dp[i+1][j?1]+isPar[i][j] 用到了一点容斥的思想. AC代码: #include <iostream> #i

Codeforces 817F - MEX Queries

817F - MEX Queries 思路: 离线+离散化+线段树 代码: #include<bits/stdc++.h> using namespace std; #define LL long long #define pb push_back #define ls rt<<1,l,m #define rs rt<<1|1,m+1,r const int N=1e5+5; int t[N],tree[N*16],lazy[N*16]; LL l[N],r[N]; v

「Codeforces」245H Queries for Number of Palindromes (区间dp)

题意:原题在这 You've got a string s = s1s2... s|s| of length |s|, consisting of lowercase English letters. There also are q queries, each query is described by two integers li, ri (1 ≤ li ≤ ri ≤ |s|). The answer to the query is the number of substrings of

CodeForces 825G&quot;Tree Queries&quot;(建树选根)

传送门 •参考资料 [1]:CodeForces 825G Educational Round #25 G :建树选根大法+O1大法+iostream解绑了还是慢 •题意 给定一颗包含 n 个节点的树,开始树的所有节点都是白色的: 给出 q 次询问,询问分为1.2两种: 将节点 x 涂成黑色. 询问节点 x 到所有的黑点节点的简单路径中的标号最小的那个点(包括起点和黑点) 题目保证第一次询问是 1 类型的. •题解 如果我们随便选取某节点作为根节点,那么询问的时候,我们要找到节点 x 到所有黑色

Codeforces 1213G Path Queries

cf题面 中文题面 给一棵无根树,每条边有边权.然后q个询问,每次询问给个w,求树上有多少对点之间的路径上的最大值小于等于w. 解题思路 离线.先把所有边按照边长升序排序,再把所有询问按照w升序排序. 之后从小到大处理每个询问.对于一个询问,首先由于询问已经排好序了,所以前一个答案是之前加的边对于答案的贡献,我们就先把上一个询问的答案直接复制过来,之后把小于等于这个询问的w的所有边加入到树上,然后并查集更新答案:每加一条边,对答案产生的贡献是"这条边两端的连通块"大小之积. 之后恢复顺

Codeforces Round #463

A - Palindromic Supersequence /* 题目大意:给出一个串,构造一个包含该串的回文串 */ #include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int N=10010; char s[N]; int main(){ scanf("%s",s); int n=strlen(s); for(int i=n-1;

使用dig查询dns解析

原文地址:使用dig查询dns解析 作者:chenwenming 一般来说linux下查询域名解析有两种选择,nslookup或者dig,而在使用上我觉得dig更加方便顺手. 如果是在debian下的话,只要装上dnsutils这个包就可以使用dig命令了. 最基本的使用方式就是 dig www.oolec.com 即查询域名的A记录,查询的dns服务器将采用系统配置的服务器,即/etc/resovle.conf 中的. 如果要查询其他类型的记录,比如MX,CNAME,NS,PTR等,只需将类型