[传智杯 #5 初赛] B-莲子的机械动力学


import java.util.Scanner;

public class Main {
	
	
	public static int[] a = new int[200005];
    public static int[] b = new int[200005];
    public static int[] c = new int[200005];

	
	public static void main(String[] args) {
		
		Scanner scanner = new Scanner(System.in);
		
		int n = scanner.nextInt(), m = scanner.nextInt();
		
        int maxLength = Math.max(n, m);
        
        for (int i = (maxLength - n) + 1; i <= maxLength; ++i)
            a[i] = scanner.nextInt();
        for (int i = (maxLength - m) + 1; i <= maxLength; ++i)
            b[i] = scanner.nextInt();
        for (int i = maxLength, cnt = 2; i > 0; --i, ++cnt) {
            c[i] += a[i] + b[i];
            if (c[i] >= cnt) {
                c[i] -= cnt;
                c[i - 1] += 1;
            }
        }
        if (c[0] > 0) {
            System.out.printf("%d ", c[0]);
        }
        for (int i = 1; i <= maxLength; ++i) {
            System.out.printf("%d ", c[i]);
        }
        System.out.println();
	}
	
}

题目背景

 

【题目背景和题目描述的两个题面是完全等价的,您可以选择阅读其中一部分。】

专攻超统一物理学的莲子,对机械结构的运动颇有了解。如下图所示,是一个三进制加法计算器的(超简化)示意图。

一个四位的三进制整数,从低到高位,标为 x_1,x_2,x_3,x_4x1​,x2​,x3​,x4​。换言之,这个数可以写成 \overline{x_4x_3x_2x_1}_{(3)}x4​x3​x2​x1​​(3)​。把它放在这四个齿轮里,对应箭头指向的数字就是现在这位的数值。

在这种机械式计算机里,我们通过齿轮的啮合来实现数位间的连接。通过不同齿轮半径的比例来确定进制。图中所有浅灰色的小齿轮的半径,比上使用皮带相接的较大齿轮的半径,都是 1:31:3。那么小齿轮每转动一圈,大齿轮就转动 \dfrac{1}{3}31​ 圈,也就是刚好一个数码的角度。

于是,我们通过控制齿轮的半径实现了 33 进制的进位。

如果需要实现三进制加法,则只需要在对应数位拨动对应的数码长度即可。

如下是个例子,实现 \overline{1021}_{(3)}+\overline{0021}_{(3)}=\overline{1112}_{(3)}1021(3)​+0021(3)​=1112(3)​

初始时齿轮的状态如上。

把第一个齿轮拨动一个单位长度,变为如上图所示。

把第二个齿轮拨动两个单位长度,变为如上图所示。读数,得到结果 \overline{1112}_{(3)}1112(3)​。


现在莲子设计了如下图所示的机械结构。对于从左往右数的第 ii 枚齿轮,它上面的浅色小齿轮与第 i+1i+1 枚齿轮上的深色小齿轮的半径之比为 1:(i+2)1:(i+2)。也就是说,第 ii 枚齿轮每转动 11 圈,第 i+1i+1 枚齿轮转过的角度恰好为它上面的一个数码。

莲子想要知道,在这样的特别的进制表示下,给定 a,ba,b,那么计算出的 a+ba+b 的结果是多少。

题目描述

题目背景的问题可以转化为如下描述:

给定两个长度分别为 n,mn,m 的整数 a,ba,b,计算它们的和。

但是要注意的是,这里的 a,ba,b 采用了某种特殊的进制表示法。最终的结果也会采用该种表示法。具体而言,从低位往高位数起,第 ii 位采用的是 i+1i+1 进制。换言之,相较于十进制下每一位的「逢 1010 进 11」,该种进制下第 ii 位是「逢 i+1i+1 进 11」。

下图所示,左边是十进制的竖式加法;右边是这种特殊进制的竖式加法。图中的红色加号表示上一位发生了进位。

输入格式

  • 第一行有两个整数 n,mn,m,分别表示 aa 和 bb 的位数。
  • 第二行有 nn 个整数,中间用空格隔开,从高到低位描述 aa 的每个数码。
  • 第三行有 mm 个整数,中间用空格隔开,从高到低位描述 bb 的每个数码。

输出格式

  • 输出有若干个整数,从高到低位输出 a+ba+b 在这种特殊表示法下的结果。

输入输出样例

输入 #1复制

5 4
3 3 2 1 1
3 2 2 1

输出 #1复制

4 2 1 1 0

输入 #2复制

10 1
10 9 8 7 6 5 4 3 2 1
0

输出 #2复制

10 9 8 7 6 5 4 3 2 1

说明/提示

对于全部数据,保证 1\le n,m\le 2\times 10^51≤n,m≤2×105,从低位往高位数起有 a_i\in[0,i]ai​∈[0,i],b_i\in[0,i]bi​∈[0,i]。请使用 Java 或 Python 语言作答的选手注意输入输出时的效率。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

萤火的微亮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值