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;
}