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 x between 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 l, r 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
题意: 给出一个递归函数,给出一个区间(l,r),求出这个函数在此区间有多少个数等于k。
思路: 打个表(很明显)这个函数的值小于10,那么开个9维前缀和就可以了。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn = 1e6 + 7;
int a[maxn],sum[maxn][10];
int f(int x)
{
int ans = 1;
while(x)
{
if(x % 10 != 0)
ans *= x % 10;
x /= 10;
}
return ans;
}
int g(int x)
{
if(x < 10)return x;
return g(f(x));
}
int main()
{
for(int i = 1;i <= 1000000;i++)
{
a[i] = g(i);
sum[i][a[i]] = 1;
}
for(int i = 1;i <= 9;i++)
{
for(int j = 1;j <= 1000000;j++)
{
sum[j][i] += sum[j - 1][i];
}
}
int Q;scanf("%d",&Q);
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;
}
本文介绍了一个基于递归函数的查询算法,通过预处理和前缀和技巧,快速解决区间内特定函数值出现次数的问题。
184

被折叠的 条评论
为什么被折叠?



