第n个好数

题目描述

定义“好数”为7的倍数且数字中不含4的数,编写程序在1秒内找出第1000000000000(1e12)个好数

题解

数位dp+二分

#include 
#include 
#include 

typedef unsigned long long ull;

using namespace std;
const int N = 20;
int a[N];
ull f[N][10], n; 
ull dfs(int pos, int limit, int mod) {
    if (!pos) {
        if (mod) return 0;
        else return 1;
    }
    if (!limit && f[pos][mod] != -1) return f[pos][mod];
    ull res = 0, up = limit ? a[pos] : 9;
    for (int i = 0; i <= up; i++) {
        if (i == 4) continue;
        res += dfs(pos - 1, limit && i == up, (mod * 10 + i) % 7);
    }
    return limit ? res : f[pos][mod] = res;
}

ull dp(ull num) {
    memset(f, -1, sizeof f);
    int len = 0;
    while (num) a[++len] = num % 10, num /= 10;
    return dfs(len, 1, 0) - 1;
}


int main() {
    cin >> n;
    ull l = 1, r = 1e18;
    while (l < r) {
        ull mid = (l + r) >> 1;
        if (dp(mid) >= n) r = mid;
        else l = mid + 1;
    }
    cout << l << endl;
    return 0;
}

你可能感兴趣的:(蓝桥杯,c++,算法,动态规划,蓝桥杯,数据结构)