#include using namespace std; // 常量定义 const int N = 10010; // 最大楼层数 const int M = 110; // 每层最大房间数 const int mod = 20123; // 取模基数 // 全局变量 int n, m; // n:楼层数(不含顶层), m:每层房间数 int k; // 当前所在房间号 int a[N][M]; // a[i][j]:第i层j号房间是否有楼梯(0/1) int b[N]; // b[i]:第i层有楼梯的房间总数 int num[N][M]; // num[i][j]:第i层j号房间的指示牌数字 /** * 主函数:模拟寻宝过程,计算密钥 * 算法思路: * 1. 读取输入数据,统计每层有楼梯的房间数 * 2. 从初始房间开始,逐层向上 * 3. 每层根据指示牌数字计算要走的步数 * 4. 模拟行走过程,找到上楼房间 * 5. 累加指示牌数字作为密钥 */ int main() { // 读取楼层和房间数 cin >> n >> m; int res = 0; // 密钥结果 // 读取每层每个房间的数据 for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> a[i][j] >> num[i][j]; b[i] += a[i][j]; // 统计本层有楼梯的房间数 } } // 读取初始房间号 cin >> k; /* t t t */ // 逐层处理 for (int i = 0; i < n; i++) { // 累加当前房间的指示牌数字(模20123) int t = num[i][k]; res = (res + t) % mod; // 计算实际需要走的步数 t %= b[i]; // 取模避免重复绕圈 if (!t) t = b[i];// 处理模0的情况 // 模拟行走过程 int sum = 0; // 已走的有效步数 while (sum < t) { sum += a[i][k]; // 只有有楼梯的房间才算一步 if (sum == t) break; // 达到目标步数 // 移动到下一个房间(环形处理) k = (k + 1) % m; } } // 输出结果 printf("%d\n", res); return 0; }