每个 subtask 都过了一些,参考的是 https://www.cnblogs.com/master-lio/p/17615301.html
#include<bits/stdc++.h>
using namespace std;
typedef unsigned int ui;
typedef long long ll;
typedef unsigned long long ull;
const ui inf=0xffffffff;
ui N,M,A,U,S,B,T,C,L,F;
struct MT{
ui mti;
ui mt[200001];
MT(ui seed=0){
mti=0;
mt[0]=seed;
for(ui i=1;i<N;i++){
mt[i]=(F*(mt[i-1]^(mt[i-1]>>30))+i)&0xffffffff;
}
}
void twist(){
for(ui i=0;i<N;i++){
ui y=(mt[i]&0x80000000)+(mt[(i+1)%N]&0x7fffffff);
mt[i]=mt[(i+M)%N]^(y>>1);
if(y&1)mt[i]^=A;
}
}
ui get(){
if(mti==0)twist();
ui y=mt[mti];
y=y^y>>U;
y=y^(y<<S&B);
y=y^(y<<T&C);
y=y^y>>L;
mti=(mti+1)%N;
return y;
}
};
ui inverse_right(ui m,ui l){
ui res=m;
for(ui i=0;i<32/l;i++){
res=m^(res>>l);
}
return res;
}
ui inverse_left(ui m,ui l,ui mask){
ui res=m;
for(ui i=0;i<32/l;i++){
res=m^(res<<l&mask);
}
return res;
}
ui invert_temper(ui m){
m=inverse_right(m,L);
m=inverse_left(m,T,C);
m=inverse_left(m,S,B);
m=inverse_right(m,U);
return m;
}
MT clone_mt(const vector<ui>&record){
MT gen=MT();
for(ui i=0;i<N;i++)gen.mt[i]=invert_temper(record[i]);
gen.mti=0;
return gen;
}
vector<ui>backtrace(const vector<ui>&cur){
ui high=0x80000000,low=0x7fffffff,mask=A;
auto state=cur;
for(int i=N-1;i>=0;i--){
ui tmp=state[i]^state[(i+M)%N];
if((tmp&high)==high){
tmp^=mask;
tmp=tmp<<1|1;
}else{
tmp<<=1;
}
ui res=tmp&high;
tmp=state[(i-1+N)%N]^state[(i+M-1)%N];
if((tmp&high)==high){
tmp^=mask;
tmp=tmp<<1|1;
}else{
tmp<<=1;
}
res|=tmp&low;
state[i]=res;
}
return state;
}
vector<ui>recover_state(const vector<ui>&out){
vector<ui>state;
for(auto i:out){
state.push_back(invert_temper(i));
}
return state;
}
void exgcd(ll a,ll b,ll& x,ll& y) {
if(b==0) {
x=1,y=0;
} else {
exgcd(b,a%b,x,y);
ll t=x;
x=y;
y=t-a/b*y;
}
}
ui recover(ui lst){
ll x,y;
exgcd(F,0x100000000,x,y);
ui inv=(x+0x100000000)&0xffffffff;
// cout<<inv<<"*\n";
for(int i=N-1;i>0;i--){
lst=(lst-i)*inv;
lst=inverse_right(lst,30);
}
return lst;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin>>N>>M>>A>>U>>S>>B>>T>>C>>L>>F;
vector<ui>v;
MT rng(114514);
for(ui i=0;i<N;i++){
ui x;
// x=rng.get();
cin>>x;
v.push_back(x);
}
ui ans=recover(backtrace(recover_state(v)).back());
// MT rng2(ans);
// for (ui i=0;i<N;i++){
// cout<<v[i]<<" "<<rng2.get()<<"\n";
// }
cout<<ans;
return 0;
}