社区讨论

暴力写挂,找了半小时

CF896CWillem, Chtholly and Seniorious参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lo1ssomv
此快照首次捕获于
2023/10/23 02:24
2 年前
此快照最后确认于
2023/11/03 03:00
2 年前
查看原帖
code:
CPP
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=1e5+5,mod=1e9+7;
ll seed,vmax;
inline ll rnd(){
	ll ret=seed;
	seed=(seed*7+13)%mod;
	return ret;
}
ll n,m,a[N];
ll ksm(ll x,ll y,ll p){
	ll sum=1;
	for(;y;y>>=1){
		if(y&1)sum=sum*x%p; 
		x=x*x%p;
	}
	return sum;
}
/*struct node{
	ll l,r;
	mutable ll v;
	node(ll l,ll r=0,ll v=0):l(l),r(r),v(v){}
	inline bool operator < (const node x)const{
		return l<x.l;
	}
};
set<node>s;
auto split(ll p){
	auto it=s.lower_bound(node(p));
	if(it!=s.end()&&it->l==p)return it;
	--it;
	if(it->r<p)return s.end();
	ll l=it->l,r=it->r,v=it->v;
	s.erase(it);
	s.insert(node(l,p-1,v));
	return s.insert(node(p,r,v)).first;
}
void add(ll l,ll r,ll x){
	auto itr=split(r+1),itl=split(l);
	for(auto it=itl;it!=itr;++it)it->v+=x;
}
void change(ll l,ll r,ll x){
	auto itr=split(r+1),itl=split(l);
	s.erase(itl,itr);
	s.insert(node(l,r,x));
}
ll rnk(ll l,ll r,ll x){
	auto itr=split(r+1),itl=split(l);
	vector<pair<ll,ll> >b;
	for(auto it=itl;it!=itr;++it)
		b.push_back({it->v,it->r-it->l+1});
	sort(b.begin(),b.end());
	for(ll i=0;i<b.size();++i){
		if(b[i].second<x)
			x-=b[i].second;
		else return b[i].first;
	}
}
ll query(ll l,ll r,ll x,ll y){
	auto itr=split(r+1),itl=split(l);
	ll ans=0;
	for(auto it=itl;it!=itr;++it)
		ans=(ans+ksm(it->v,x,y)*(it->r-it->l+1)%y)%y;
	return ans;
}*/
int main(){
	cin>>n>>m>>seed>>vmax;
	for(ll i=1;i<=n;++i){
		a[i]=rnd()%vmax+1;
//		s.insert(node(i,i,a[i]));
	}
	for(ll op,l,r,x,y,i=1;i<=m;++i){
		op=rnd()%4+1;
		l=rnd()%n+1;
		r=rnd()%n+1;
		if(l>r)swap(l,r);
		if(op==3)x=rnd()%(r-l+1)+1;
		else x=rnd()%vmax+1;
		if(op==4)y=rnd()%vmax+1;
		/*if(op==1)add(l,r,x);
		else if(op==2)change(l,r,x);
		else if(op==3)printf("%lld\n",rnk(l,r,x));
		else printf("%lld\n",query(l,r,x,y));*/
		if(op==1){
			for(int i=l;i<=r;++i)
				a[i]+=x;
		}
		else if(op==2){
			fill(a+l,a+r+1,x);
		}
		else if(op==3){
			vector<ll>c;
			for(int i=l;i<=r;++i)
				c.push_back(a[i]);
			sort(c.begin(),c.end());
			printf("%lld\n",c[x-1]);
		}
		else{
			ll ans=0;
			for(int i=l;i<=r;++i)
				ans=(ans+ksm(a[i],x,y))%y;
			printf("%lld\n",ans);
		}
	}
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...