因为这道题的x过大,直接枚举是一定过不了的,但是我们不难发现,这是有循环的,所以我们直接在这里取余就可以了,但是我们又要注意一下当前房间是有楼梯的情况,所以我们可以在此基础上加上一圈在减去当前的情况(有楼梯为1,没有为0),如果是有的,那么就会少跑一点,如果没有,再跑一圈也是可以的。
#include<bits/stdc++.h>
using namespace std;
struct f{
int num,s;
};
f mp[10010][110];
int x,tot[10010];
long long ans;
int main(){
//freopen("treasure.in","r",stdin);
//freopen("treasure.out","w",stdout);
int n,m;
cin>>n>>m;
for (int i=1;i<=n;i++){
for (int j=0;j<m;j++){
cin>>mp[i][j].s>>mp[i][j].num;
if (mp[i][j].s==1)tot[i]++;
}
}
cin>>x;
for (int i=1;i<=n;i++){
int tmp1=mp[i][x].num,tmp2=mp[i][x].s;
ans+=tmp1,ans%=20123;
tmp1=tmp1%tot[i]+tot[i]-tmp2;
while (tmp1>0){
x=(x+1)%m;
if (mp[i][x].s==1)tmp1--;
}
}
cout<<ans%20123;
return 0;
}