3191:The Moronic Cowmpouter
keyword
n進数 C++
概要
x(|x|<2^31)が与えられたときその-2進数表記を出力する問題。
分からなかったので実験。あるビット数以下で表せる数は連続であることに気づく。したがってビット数がn本以下のときの上限と下限を知っておけば、上からビットを立てるべきか立てないべきか判定できる。
int main(){ int i,pos=0; ll n; scanf("%lld",&n); ll twos[45], ub[45], lb[45]; twos[0] = 1; ub[0] = 1; lb[0] = 0; REP(i,40) twos[i+1] = -2*twos[i]; REP(i,40){ ub[i+1] = max(ub[i], ub[i]+twos[i+1]); lb[i+1] = min(lb[i], lb[i]+twos[i+1]); } string ans=""; if(n==0){ printf("0\n"); return 0; } for(i=40;i>=0;i--){ if(!(lb[i] <= n + twos[i] && n + twos[i] <= ub[i])){ n -= twos[i]; ans += '1'; } else ans += '0'; } REP(i,40)if(ans[i]=='1')break; printf("%s\n",ans.substr(i).c_str()); return 0; }