3 条题解

  • 2
    @ 2024-5-27 16:58:21
    V, q = map(int, input().split())
    
    # s 用来存储 V 转换为三进制后的每一位,列表中的索引对应三进制的位数
    s = []
    
    # n 用以记录 V 的三进制位数
    n = 0
    
    # 将 V 转换为三进制数表示,并存储在列表 s 中
    while V > 0:
        s.append(V % 3)
        V = V // 3
        n += 1
    
    # 扩充列表 s 到足够的长度,以确保即便后续有高位的操作也能正确执行
    for i in range(1000):
        s.append(0)
    
    # 处理 q 次操作
    for j in range(q):
        op, i = map(int, input().split())
        # 更新 n,保证 n 始终为操作的最大位数
        n = max(n, i)
        # 操作一:s[i] 的值按照 0→1→2→0 循环变化
        if op == 1:
            s[i] = (s[i] + 1) % 3
        # 操作二:s[i] 的值按照 0→2→1→0 循环变化
        if op == 2:
            s[i] = (s[i] + 2) % 3
        # 操作三:s[i] 的值在 1 和 2 之间变化,0保持不变
        if op == 3:
            if s[i] == 1:
                s[i] = 2
            elif s[i] == 2:
                s[i] = 1
    
        # 操作完后,计算从三进制数转换回十进制后的结果
        res = 0
        k = 1
        for i in range(n + 1):
            res += k * s[i]
            k = k * 3
        # 输出每次操作后的三进制数对应的十进制数
        print(res)
    
    • 1
      @ 2024-5-29 19:30:04

      来发数学,无列表。

      vp,q = map(int,input().split())
      for i in range(q):
          op, j = map(int, input().split())
          v = vp//(3**j) # 在j之前的位数所代表的值,删去后面所有的数
          vo = vp%(3**j) # 在j之后的位数所代表的值
          if op==3 :
              if (v%3==1): # j位是1
                  v = v+1
              elif (v%3==2):  # j位是2
                  v = v-1
          else :
              # 瞪眼法可知,一二情况即为j位往上数两位。
              v = (v%3+op)%3+v//3*3
      
          vp = v*(3**j)+vo  # 计算最后的数
          print(vp)
      
      • -1
        @ 2024-5-28 10:09:14

        Python

        ternary: list[int] = [0] * 105
        
        V: int
        q: int
        V, q = map(int, input().split())
        
        n: int = 0
        
        while V:
            ternary[n] = V % 3
            n += 1
            V //= 3
        
        for _ in range(q):
            op, idx = map(int, input().split())
            n = max(n, idx)
            match op:
                case 1:
                    ternary[idx] = (ternary[idx] + 1) % 3
                case 2:
                    ternary[idx] = (ternary[idx] + 2) % 3
                case 3:
                    ternary[idx] = (3 - ternary[idx]) % 3
            
            ans: int = 0
            for i in range(n, -1, -1):
                ans = ans * 3 + ternary[i]
        
            print(ans)
        
        • @ 2024-5-28 10:10:47

          注意:

          1. match-case 只有 python 3.10 以上可用
          2. builtin.list 的类型注解只有 python 3.9 以上可用
      • 1

      信息

      ID
      933
      时间
      1000ms
      内存
      512MiB
      难度
      8
      标签
      递交数
      671
      已通过
      100
      上传者