V - Recursive Queries 打表 + 前缀和

传送门
思路:给出的数据过大 考虑打表。
分为两部分
1.按题意分离每位上的数,将他们对应的个位数存起来。
2.O(9 * 1e6)预处理。
3.前缀和iutput,注意端点情况。

#include<iostream>
using namespace std;
int sum[10][1000001];
int a[1000001];
int solve(int x)
{
    int ans = 1000001;
    while(ans >= 10)
    {
        int t = 1;
        ans = 1;
        while(x != 0)
        {
            t = x % 10;
            if(t == 0)
                ans *= 1;
            else ans *= t;
            x /= 10;
        }
        x = ans;
    }
    return ans;
}
int main()
{
    ios::sync_with_stdio(false);
    for(int i = 1; i <= 1000000; i++)
    {
        a[i] = solve(i);
    }
    for(int i = 1; i <= 9; i++)
    {
        for(int j = 1; j <= 1000000; j++)
        {
            if(a[j] == i)
            {
                sum[i][j] = sum[i][j - 1] + 1;
                //vis[j] = 1;
            }
            else sum[i][j] = sum[i][j - 1];
        }
    }
    int T;
    cin >> T;
    while(T--)
    {
        int l, r, k;
        cin >> l >> r >> k;
        if(a[l] == k)
            cout << sum[k][r] - sum[k][l] + 1 << endl;
        else cout << sum[k][r] - sum[k][l] << endl;
    }
    return 0;
}

发布了241 篇原创文章 · 获赞 8 · 访问量 4854

猜你喜欢

转载自blog.csdn.net/weixin_43960370/article/details/103424794