#P1557. Mapmaker

Mapmaker

题目描述

赛博软件计算机公司(编程语言领域的领导者)聘请你开发一种名为A--的新编程语言。你的任务是处理该语言中的数组映射问题:将数组引用(如x[5,6]x[5,6])转换为实际物理地址。为此,你需要编写一个程序,读取数组声明和引用,并计算每个引用的物理地址,结果以十进制整数形式输出。

数组引用A[i1,i2,...,iD]A[i₁, i₂, ..., iᴰ]的物理地址计算公式为:C0+C1i1+C2i2+...+CDiDC_0 + C_1i_1 + C_2i_2 + ... + C_Di_D,其中常数C0C_0CDC_D的计算方式如下:

  • BB:数组的基地址
  • DD:数组的维度数
  • LdL_d:第dd维的下界
  • UdU_d:第dd维的上界
  • CDC_D:数组元素的大小(字节)
  • Cd=Cd+1×(Ud+1Ld+1+1)C_d = C_{d+1} \times (U_{d+1} - L_{d+1} + 1)(对于1d<D1 \leq d < D
  • C0=BC1L1C2L2...CDLDC_0 = B - C_1L_1 - C_2L_2 - ... - C_DL_D

输入格式

输入的第一行包含两个正整数:NN(数据文件中定义的数组数量)和RR(需要计算地址的数组引用数量)。接下来的NN行每行定义一个数组,格式如下:

  • 数组名(长度不超过10个字符)
  • 数组的基地址(正整数)
  • 每个数组元素的大小(字节,正整数)
  • 数组的维度数DD(1 ≤ DD ≤ 10)
  • DD对整数,表示数组各维度的下界和上界(共2D2D个整数)

随后的RR行每行包含一个数组引用,格式为:数组名后跟DD个整数索引i1,i2,...,iDi_1, i_2, ..., i_D,其中DD是该数组的维度。

输出格式

对每个数组引用,输出一行,格式为:

  1. 数组名
  2. 左方括号$[`
  3. 各索引值(每对索引之间用逗号加空格分隔)
  4. 右方括号`]$、空格、等号、空格
  5. 计算得到的物理地址

输入示例1

3 4  
ONE 1500 2 2 0 3 1 5  
TWO 2000 4 3 1 4 0 5 5 10  
THREE 3000 1 1 1 9  
ONE 2 4  
THREE 7  
TWO 2 0 6  
TWO 3 3 9  

输出示例1

ONE[2, 4] = 1526  
THREE[7] = 3006  
TWO[2, 0, 6] = 2148  
TWO[3, 3, 9] = 2376  

来源

Mid-Central USA 1996