求助入门赛G题二进制与一,WA了一个点#9
  • 板块题目总版
  • 楼主hzx198
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/1/19 21:33
  • 上次更新2024/1/20 09:34:25
查看原帖
求助入门赛G题二进制与一,WA了一个点#9
792364
hzx198楼主2024/1/19 21:33
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
ll n, q, ans;
// x 的二进制位数
ll digit(ll x) {
  ll ans = 0;
  while (x) {
    x >>= 1;
    ans++;
  }
  return ans;
}
// 获取 x 从右往左数的第 dig 位二进制位
bool get(ll x, ll dig) {
  if (dig == 1) return x & 1;
  return (x >> (dig-1)) & 1;
}
int main(void) {
  cin >> n >> q;
  while (q--) {
    ll k;
    cin >> k;
    if (get(n, k) == 0) {
      if (digit(n) < k) {
        ans += ((1 << (k-1)) - n);
        n = (1 << (k-1));
      } else {
        if (k == 1) {
          n++;
          ans++;
        } else {
          ll high = n >> (k-1);
          high++;
          high = high << (k-1);
          ans += (high-n);
          n = high;
        }
      }
    }
  }
  cout << ans;
  return 0;
}
2024/1/19 21:33
加载中...