はまやんはまやんはまやん

hamayanhamayan's blog

755 [AtCoder Beginner Contest 114 C]

https://beta.atcoder.jp/contests/abc114/tasks/abc114_c

解説

https://beta.atcoder.jp/contests/abc114/submissions/3708011

全探索をしよう。
10^9以下の七五三数というのは実はそんなに多くない。
9桁で各桁357のいずれかになる組み合わせは3^9通りあるが、これは全探索で試せる。
なので、3~9桁のすべてについて七五三数を作り、N以下の数の個数を数えると答え。
3進数の全探索が少し大変だが、「3のあまりを見て、3で割る」というのを繰り返せば下の桁から数が取得できるので、
それ以外は2進数と同じように行っていく。

int N;
int v[3] = { 3,5,7 };
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> N;
    int ans = 0;
 
    rep(dgt, 3, 10) {
        int ma = 1;
        rep(i, 0, dgt) ma *= 3;
 
        rep(msk, 0, ma) {
            int x = 0;
            int m = msk;
            int cn[3] = { 0, 0, 0 };
            rep(i, 0, dgt) {
                int d = m % 3;
                x = x * 10 + v[d];
                cn[d]++;
                m /= 3;
            }
            if (x <= N and 0 < cn[0] and 0 < cn[1] and 0 < cn[2]) ans++;
        }
    }
 
    cout << ans << endl;
}