結果

問題 No.294 SuperFizzBuzz
ユーザー chakkuchakku
提出日時 2016-03-30 02:41:42
言語 C++11
(gcc 11.4.0)
結果
CE  
(最新)
AC  
(最初)
実行時間 -
コード長 1,593 bytes
コンパイル時間 872 ms
コンパイル使用メモリ 61,356 KB
最終ジャッジ日時 2023-07-25 08:30:16
合計ジャッジ時間 1,829 ms
ジャッジサーバーID
(参考情報)
judge13 / judge14
このコードへのチャレンジ(β)
コンパイルエラー時のメッセージ・ソースコードは、提出者また管理者しか表示できないようにしております。(リジャッジ後のコンパイルエラーは公開されます)
ただし、clay言語の場合は開発者のデバッグのため、公開されます。

コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:68:19: error: ‘pow’ was not declared in this scope
     for(int i=1;i<pow(2,digit);i+=2){
                   ^~~

ソースコード

diff #

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
#include <climits>
#include <cassert>
using namespace std;

#define REP(i,n) for(int i=0;i<n;i++)
#define INF INT_MAX/3
#define MP make_pair
#define PB push_back
#define ALL(v) (v).begin(),(v).end()

typedef long long ll;
typedef pair<int,int> pii;
typedef vector<int> vi;
typedef vector<vi> vvi;

ll C[30][30];
ll dig[30];

void comb(){
    REP(i,30) C[i][i] = 1;
    REP(i,30) C[i][0] = 1;

    for(int i=1;i<30;i++){
        for(int j=1;j<i;j++){
            C[i][j] = C[i-1][j-1] + C[i-1][j];
        }
    }
}

int one(int n){
    int cnt=0;
    while(n>0){
        if(n%2) cnt++;
        n >>= 1;
    }
    return cnt;
}

int main(){
    ll N;
    cin >> N;

    comb();

    for(int i=3;i<30;i++){
        for(int j=2;j<i;j+=3){
            dig[i] += C[i-1][j];
        }
    }

    int digit = 0;
    ll sum = 0;
    for(int i=3;i<30;i++){
        sum += dig[i];
        digit = i;
        if(sum>=N) break;
    }

    N = N - (sum - dig[digit]);
    int cnt = 0;
    for(int i=1;i<pow(2,digit);i+=2){
        assert(i%2==1);
        int o = one(i);
        if(o%3!=0) continue;
        cnt++;
        if(cnt==N){
            int n = i;
            string ans = "";
            while(n>0){
                if(n%2==0) ans+="3";
                else ans += "5";
                n>>=1;
            }
            string l = string(digit-ans.length(),'3');
            reverse(ALL(ans));
            cout << l << ans << endl;
            return 0;
        }
    }
}
0