前缀和的应用 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值是多少。

然后开一个二元数组记录一下,并且用到了前缀和,统计从1开始k值出现的次数:(打表)

void get_table()
{
    for(int i = 1; i <= MX; ++i) mp[i][f(i)]++;
    for(int i = 1; i <= MX; ++i)
        for(int j = 1; j <= 9; ++j)
            mp[i][j] += mp[i-1][j];
}

最后,得到代码如下:(AC代码)

#include <iostream>
#include <cstdio>

using namespace std;
const int MX = 1e6+10;
int mp[MX][10];

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);
}

void get_table() //打表求值
{
    for(int i = 1; i <= MX; ++i) mp[i][f(i)]++;
    for(int i = 1; i <= MX; ++i)
        for(int j = 1; j <= 9; ++j)
            mp[i][j] += mp[i-1][j];
}

int main()
{
    get_table();
    int T;
    scanf("%d", &T);
    while(T--)
    {
        int le, ri, k;
        scanf("%d%d%d", &le, &ri, &k);
        int ans = mp[ri][k] - mp[le-1][k]; //left减一的理由是从le开始包括le, 若不减一的话left也会被减掉!
        printf("%d\n", ans);
    }
    return 0;
}

如有疑问,欢迎评论!

原文地址:https://www.cnblogs.com/mpeter/p/10290296.html

时间: 2024-09-30 11:50:49

前缀和的应用 CodeForces - 932B Recursive Queries的相关文章

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 l, r and k. You need to print the number of integers xbetween l and r inclusive, such that g(x

【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的所有边加入到树上,然后并查集更新答案:每加一条边,对答案产生的贡献是"这条边两端的连通块"大小之积. 之后恢复顺

51Nod 1422 沙拉酱前缀 二分查找

1422 沙拉酱前缀 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 沙拉酱非常喜欢数字序列.这正是他要弄一个关于构造序列的算法的原因. 沙拉酱拿了一张白纸.然后他开始用m个步骤来制作一个序列.每一步他要么向这个序列的末尾添加一个数字,要么拿这个序列的开头l个数字,然后在末尾添加c次.对于第二种操作,一般的,如果当前序列是 a1,a2,...,an ,那么经过操作之后序列将变成 a1,a2,...,an[,a1

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;