サンプルがヒント。星2と指定されていれば解けた、という人も多そう。

solution

ある種の全探索。計算量はよく分からないが、線形ぐらいであるように見える。

$N \le 10^7$であるが、その上限である$10^7$番目のSuperFizzBuzz$5533533555333355355553555$(入出力例より)は$25$桁の数である。 SuperFizzBuzzの各桁は$3$か$5$のいずれかなので、$25$桁より小さいものの候補は$2^{25} = 3.4 \times 10^7$個である。 これらの候補は全て列挙して間に合う。 $3,5$からなる数が$3,5$で割り切れるかは各桁の総和や最下位桁を見ればよい。

implementation

__builtin_popcountすればよかったぽい。

#include <iostream>
#define repeat(i,n) for (int i = 0; (i) < (n); ++(i))
#define repeat_from(i,m,n) for (int i = (m); (i) < (n); ++(i))
using namespace std;
int main() {
    int n; cin >> n;
    for (int l = 0; ; ++ l) {
        repeat (s,1<<l) {
            if (not (s & 1)) continue;
            int acc = 0;
            repeat (i,l) {
                acc += (s & (1<<i)) ? 5 : 3;
            }
            if (acc % 3 == 0) {
                n -= 1;
                if (n == 0) {
                    string t(l, '3');
                    repeat (j,l) if (s & (1<<j)) t[l-j-1] = '5';
                    cout << t << endl;
                    return 0;
                }
            }
        }
    }
}