yokobuttonの不定期で競技プログラミングをするブログ

不定期で解けた競技プログラミングコンテストの問題を載せています。

AtCoder Beginner Contest 234 C - Happy New Year!

問題の要約
 10進数で表記したときに0,2のみからなる正整数のうち、K番目に小さいものを求めよ。
制約
 1<=K<=10^18
入力
 K
考え方
 1,簡単な実験(例えば15番目くらいまで書き出してみるなど)で2と0の組み合わせとKの2進数とが対応していることに気づく。
 2,入力例3から出力が大きすぎる場合があるので、出力は文字列で出力するしかない。
 3,Kの1bit目が1ならば2を、0ならば0を文字列の左に加えていく。
 4,最後に文字列の余分な0を削除して出力する。
実際のプログラム
#include<iostream>
#include<string>

using namespace std;

int main(){
  unsigned long long K;
  cin >> K;
  string ans = "";
  for(unsigned int i = 0; i < 63; i++){
    if(K & 0b1 == 1){
      ans = "2"+ans;
    }else{
      ans = "0"+ans;
    }
    K >>= 1;
  }
  while(ans[0] == '0'){
    ans = ans.erase(0,1);
  }
  
  cout << ans << endl;
  
  return 0;
}