题解:CF2145F Long Journey
一种比较暴力的方法。
考虑
但考虑一个问题,上面的写法是在可以到达的条件下的,我们可以将
#include<bits/stdc++.h>
using namespace std;
#define int long long
int t,n,m,a[15],b[15],len,dis[15][2600],power[50];
__int128 f[15][45];
bitset<2600> c,d[15],e[15];
signed main(){
power[0]=1;
for(int i=1;i<=41;i++)power[i]=power[i-1]*2;
cin>>t;
while(t--){
cin>>n>>m;
for(int i=0;i<n;i++) fill(dis[i],dis[i]+2550,1e14);
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++) cin>>b[i];
len=a[0];
for(int i=1;i<n;i++) len=lcm(len,a[i]);
for(int i=0;i<n;i++){e[i].set();for(int j=b[i];j<=len;j+=a[i])e[i].reset(j);}
for(int i=0;i<n;i++){
c.set(0);
dis[i][0]=0;
int id=1;
for(int j=0;j<6*len&&id<=len;j++){
c=((c<<1)|c)&e[(i+j)%n];
if(c[id])dis[i][id++]=j+1;
}
f[i][0]=dis[i][len];
}
int l=1,k=floor(m/len);
for(int i=1;i<=41&&l<=k;i++){for(int j=0;j<n;j++)f[j][i]=f[j][i-1]+f[(j+f[j][i-1])%n][i-1];l<<=1;}
__int128 tot=0;
for(int i=41;i>=0;i--)if(k>=power[i]){tot+=f[tot%n][i];k-=1ll*power[i];}
tot+=dis[tot%n][m%len];
if(tot>=1e14) {cout<<-1<<endl;continue;}
else cout<<(int)tot<<endl;
}
return 0;
}