結果
問題 | No.294 SuperFizzBuzz |
ユーザー |
|
提出日時 | 2015-10-23 23:44:41 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 7 ms / 5,000 ms |
コード長 | 1,978 bytes |
コンパイル時間 | 1,646 ms |
コンパイル使用メモリ | 164,304 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-09-13 03:41:10 |
合計ジャッジ時間 | 2,435 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 12 |
ソースコード
#include <bits/stdc++.h>#define GET_MACRO(a, b, c, NAME, ...) NAME#define rep(...) GET_MACRO(__VA_ARGS__, rep3, rep2)(__VA_ARGS__)#define rep2(i, a) rep3 (i, 0, a)#define rep3(i, a, b) for (int i = (a); i < (b); i++)#define repr(...) GET_MACRO(__VA_ARGS__, repr3, repr2)(__VA_ARGS__)#define repr2(i, a) repr3 (i, 0, a)#define repr3(i, a, b) for (int i = (b) - 1; i >= (a); i--)#define chmin(a, b) ((b) < a && (a = (b), true))#define chmax(a, b) (a < (b) && (a = (b), true))using namespace std;typedef long long ll;const ll inf = 2e18;ll dp[120][2][240]; // len, less, num 5template<class T>ostream &operator <<(ostream &os, const vector<T> &v) {rep (i, v.size()) {if (i) os << " ";os << v[i];}return os;}ll calc(ll a, int len) {memset(dp, 0, sizeof(dp));vector<int> v;rep (i, len) {v.push_back(a % 2);a /= 2;}int n = v.size();reverse(v.begin(), v.end());dp[0][0][0] = 1;rep (i, n) rep (j, 2) rep (k, 120) {int ub = 1;if (!j) ub = v[i];rep (x, ub + 1) {ll &next = dp[i + 1][j || x < ub][k + (x == 1)];next += dp[i][j][k];chmin(next, inf);}}ll ans = 0;rep (j, 2) rep (k, 1, 120) if (k % 3 == 2) {ans += dp[n][j][k];chmin(ans, inf);}return ans;}int len(ll a) {int res = 0;while (a) {res++;a /= 2;}return res;}string tostr(ll r, int len) {string s;rep (i, len) {if (r % 2 == 0) {s += "3";} else {s += "5";}r /= 2;}reverse(s.begin(), s.end());return s;}int main() {int n;cin >> n;ll l = 1, r = 18;vector<ll> sum(60);rep (i, 1, 60) {sum[i] = calc((1ll << i) - 1, i);}ll total = 0;int length = 0;rep (i, 1, 60) {if (total + sum[i] >= n) break;total += sum[i];length = i;}length++;l = 1, r = (1ll << length) - 1;while (r - l > 1) {ll m = (l + r) / 2;ll ret = calc(m, length);if (ret + total >= n) {r = m;} else {l = m;}}cout << tostr(r, length) + "5" << endl;return 0;}