P1076 寻宝 【洛谷算法习题】 P1076 寻宝网页链接P1076 寻宝题目描述传说很遥远的藏宝楼顶层藏着诱人的宝藏。小明历尽千辛万苦终于找到传说中的这个藏宝楼藏宝楼的门口竖着一个木板上面写有几个大字寻宝说明书。说明书的内容如下藏宝楼共有N 1 N1N1层最上面一层是顶层顶层有一个房间里面藏着宝藏。除了顶层外藏宝楼另有N NN层每层M MM个房间这M MM个房间围成一圈并按逆时针方向依次编号为0 , ⋯ , M − 1 0,\cdots,M-10,⋯,M−1。其中一些房间有通往上一层的楼梯每层楼的楼梯设计可能不同。每个房间里有一个指示牌指示牌上有一个数字x xx表示从这个房间开始按逆时针方向选择第x xx个有楼梯的房间假定该房间的编号为k kk从该房间上楼上楼后到达上一层的k kk号房间。比如当前房间的指示牌上写着2 22则按逆时针方向开始尝试找到第2 22个有楼梯的房间从该房间上楼。如果当前房间本身就有楼梯通向上层该房间作为第一个有楼梯的房间。寻宝说明书的最后用红色大号字体写着“寻宝须知帮助你找到每层上楼房间的指示牌上的数字即每层第一个进入的房间内指示牌上的数字总和为打开宝箱的密钥”。请帮助小明算出这个打开宝箱的密钥。输入格式第一行有两个整数N NN和M MM之间用一个空格隔开。N NN表示除了顶层外藏宝楼共N NN层楼M MM表示除顶层外每层楼有M MM个房间。接下来N × M N \times MN×M行每行两个整数之间用一个空格隔开每行描述一个房间内的情况其中第( i − 1 ) × M j (i-1) \times Mj(i−1)×Mj行表示第i ii层j − 1 j-1j−1号房间的情况i 1 , 2 , ⋯ , N i1,2,\cdots, Ni1,2,⋯,Nj 1 , 2 , ⋯ , M j1,2,\cdots,Mj1,2,⋯,M。第一个整数表示该房间是否有楼梯通往上一层0 00表示没有1 11表示有第二个整数表示指示牌上的数字。注意从j jj号房间的楼梯爬到上一层到达的房间一定也是j jj号房间。最后一行一个整数表示小明从藏宝楼底层的几号房间进入开始寻宝注房间编号从0 00开始。输出格式一个整数表示打开宝箱的密钥这个数可能会很大请输出对20123 2012320123取模的结果即可。输入输出样例 #1输入 #12 3 1 2 0 3 1 4 0 1 1 5 1 2 1输出 #15说明/提示【数据范围】对于50 % 50\%50%数据有0 N ≤ 1000 , 0 x ≤ 10 4 0N \le 1000,0x \le 10^40N≤1000,0x≤104对于100 % 100\%100%数据有0 N ≤ 10000 , 0 M ≤ 100 , 0 x ≤ 10 6 0N\le 10000,0M\le 100,0x \le 10^60N≤10000,0M≤100,0x≤106。NOIP 2012 普及组 第二题解题思路本题核心是逐层模拟寻宝流程环形查找楼梯房间计算密钥藏宝楼每层房间环形排列仅能从有楼梯的房间上楼。预处理每层的楼梯房间总数用于简化超大指示数字的计算从初始房间开始逐层累加当前房间的指示牌数字并对20123取模通过取模运算优化超大步数避免无效遍历按照逆时针方向线性查找目标楼梯房间将其作为上一层的起始房间。依托M≤100的小范围约束直接线性查找楼梯房间整体时间复杂度为O(N×M)完美适配N≤10000的大数据规模精准模拟流程并得到最终密钥。总结核心逻辑模拟逐层上楼的寻宝过程累加每层起始房间的指示牌数字环形查找下一层的楼梯入口房间。关键操作预处理每层楼梯数量用取模简化查找步数逆时针线性遍历定位目标楼梯房间。效率保障房间列数M限制极小线性查找无冗余计算整体复杂度适配题目数据规模实时取模保证结果合规。代码内容#includebits/stdc.husingnamespacestd;typedeflonglongll;typedefunsignedlonglongull;typedefvectorvectorllvt;typedefpairll,llpll;constll N1e410;constll p1e97;constll INF1e18;structnode{ll x,y;}a[N][105];ll c[N],mod20123;intmain(){ll n,m;cinnm;for(ll i1;in;i)for(ll j0;jm;j){cina[i][j].xa[i][j].y;c[i]a[i][j].x;}ll op,ans0,f;cinop;for(ll i1;in;i){ans(ansa[i][op].y)%mod;f(a[i][op].y-1)%c[i]1;while(f){if(opm)op0;if(a[i][op].x)f--;op;}op--;}coutans%modendl;return0;}