[題解]計算在k進制下,1-x的數字里某一位的出現次數


\(x\)代表數字范圍在\([1,n]\), \(tar\)是要統計的數字, \(k\)是進制.

#include <bits/stdc++.h>

using namespace std;

long long p[100];
long long dig[100];
long long tmp[100];

long long dfs(long long pos, bool limit, bool lead0, long long k, long long tar, long long x)
{
    if (pos == -1) return 0;
    if (!limit && !lead0 && tmp[pos] != -1) return tmp[pos];
    
    long long ret = 0;
    int up = limit ? dig[pos] : k-1;
    for (int i = 0; i <= up; ++i)
    {
        if (i == tar)
        {
            if (lead0 && i == 0)
            {
                ret += dfs(pos-1, limit && i == up, lead0 && i == 0, k, tar, x);
            }else if(limit && i == up)
            {
                ret += x % p[pos] + 1 + dfs(pos-1, limit && i == up, lead0 && i == 0, k, tar, x);
            }else{
                ret += p[pos] + dfs(pos-1, limit && i == up, lead0 && i == 0, k, tar, x);
            }
        }else
            ret += dfs(pos-1, limit && i == up, lead0 && i == 0, k, tar, x);
    }
    if (!limit && !lead0) tmp[pos] = ret;
    return ret;
}

long long swdp(long long x, long long k, long long tar)
{
    memset(tmp, -1, sizeof(tmp));
    int len = 0;
    long long _x = x;

    while (_x)
    {
        dig[len++] = _x%k;
        _x /= k;
    }

    p[0] = 1; for (int i = 1; i < len; ++i) p[i] = p[i-1] * k;
    
    return dfs(len-1, 1, 1, k, tar, x);
}

int main()
{
    long long x, k, tar;
    scanf("%lld%lld%lld\n", &x, &k, &tar);
    printf("%lld\n", swdp(999999999, 10 ,1));
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM