1 条题解

  • 0
    @ 2025-10-19 15:59:46

    观察操作规则:每一步 ( i )(从0开始),最多有 一个位置 能被加上 ( k^i )(或跳过该步)。

    这意味着,目标数组中的每个数 ( a[j] ),可看作是 ​若干不同 ( k^i ) 的和,因为每个 ( k^i ) 最多被一个位置使用。

    这一约束与 k进制表示 直接相关:若将每个 ( a[j] ) 转换为k进制,k进制下的每一位数字表示该位(即 ( k^i ))被使用的次数。因此,​所有数的k进制表示中,每一位的数字之和不能超过1​(否则说明某一 ( k^i ) 被多个位置同时使用,违反操作规则)。

    • @ 2025-10-19 16:04:41
      #include <bits/stdc++.h>
      using namespace std;
      typedef long long ll;
      
      void solve() {
          int n, k;
          cin >> n >> k;
          int b[80] = {0}; // 记录k进制每一位的总次数,足够容纳1e18的k进制位数
          for (int i = 0; i < n; i++) {
              ll x;
              cin >> x;
              int p = 0;
              while (x > 0) {
                  int digit = x % k; // 取k进制当前位的数字
                  b[p] += digit;     // 累加该位的使用次数
                  x /= k;            // 处理更高位
                  p++;
              }
          }
          // 检查每一位的总次数是否都不超过1
          for (int i = 0; i < 63; i++) {
              if (b[i] > 1) {
                  cout << "NO\n";
                  return;
              }
          }
          cout << "YES\n";
      }
      
      int main() {
          ios::sync_with_stdio(false);
          cin.tie(nullptr);
          int T;
          cin >> T;
          while (T--) solve();
          return 0;
      }
      
  • 1

信息

ID
1145
时间
1000ms
内存
256MiB
难度
8
标签
递交数
17
已通过
6
上传者