求条
查看原帖
求条
514727
bcdmwSjy楼主2025/1/15 20:33

每个 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;
}
2025/1/15 20:33
加载中...