https://www.luogu.com.cn/record/155417567
用的倍增,没有用周期,thx qwq
#include<bits/stdc++.h>
using namespace std;
const int N=10005,M=105,X=25,mod=20123;
int n,m,num[N][M];
bool lt[N][M];
int nx[M][X],ans;
int read(){
int f=1,k=0;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-')f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
k=k*10+c-'0';
c=getchar();
}
return f*k;
}
int main(){
//cout<<log2(1000000);//19....
n=read();m=read();
for(int i(1);i<=n;++i)
for(int j(0);j<m;++j)lt[i][j]=read(),num[i][j]=read();
int w=read();
for(int i(1);i<=n;++i){
int fst=m-1;
while(!lt[i][fst])--fst;
int nxt=fst;
for(int j(nxt);~j;--j){
if(lt[i][j])nxt=j;
nx[j][0]=nxt;//cout<<j<<": "<<nxt<<'\n';
}
for(int j(fst+1);j<m;++j)nx[j][0]=nxt;
for(int k(1);k<20;++k)
for(int j(0);j<m;++j)
nx[j][k]=nx[nx[j][k-1]][k-1];
int stp=num[i][w];(ans+=stp)%=20123;
for(int k(20);~k;--k)if(stp&(1<<k))w=nx[w][k];
//cout<<stp<<'\n';
}
printf("%d",ans);
//printf("%lld",ans);
return 0;
}