@[无钩七不改名](/user/511609) 倍增的话如果`nxt[j][0]=j`时,他不会一直自己跳自己吗。
by __zaa__ @ 2024-04-12 07:48:22
```cpp
#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=fst-1;j>=0;j--){
nx[j][0]=nxt;
if(lt[i][j])nxt=j;
}
for(int j(fst);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;
if(lt[i][w]) stp--;
// cout<<w<<'\n';
for(int k(20);~k;--k)if(stp&(1<<k))w=nx[w][k];
}
printf("%d",ans);
//printf("%lld",ans);
return 0;
}
```
by __zaa__ @ 2024-04-12 07:52:32
@[__zaa__](/user/716965) 噢噢谢谢!
by 无钩七不改名 @ 2024-04-12 17:59:20