关于ODT模板
  • 板块学术版
  • 楼主lxzy_
  • 当前回复3
  • 已保存回复3
  • 发布时间2021/2/8 15:50
  • 上次更新2023/11/5 03:32:52
查看原帖
关于ODT模板
67493
lxzy_楼主2021/2/8 15:50

如下代码在 CF896C 这道题目中WA了#3,系统提示说Fast_Pow函数出现整型溢出,但是我加了define呀

求助各位大佬

#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<vector>
#include<set>
#define IT set<Node>::iterator
#define VT vector<pair<int,int> >::iterator
#define int long long
using namespace std;
const int N=1e5+50;
const int MOD=1e9+7;
struct Node{
	int l,r;
	mutable int v;
	Node(int L=-1,int R=-1,int V=0): l(L),r(R),v(V) {}
	bool operator<(const Node& a)const {
		return l<a.l;
	}
};
set<Node> st;
int n,m,seed,vmax;
void Swap(int &x,int &y){int t=x;x=y;y=t;}
inline int Read()
{
	char ch=getchar();
	int x=0,f=1;
	while(ch>'9'||ch<'0'){
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=(x<<1)+(x<<3)+ch-'0';
		ch=getchar();
	}
	return x*f;
}
int Fast_Pow(int a,int b,int p)
{
	int ans=1,base=a;
	while(b){
		if(b&1) ans*=base,ans%=p;
		base*=base;
		base%=p;
		b>>=1;
	}
	return ans;
}
IT Split(int pos)
{
	IT it=st.lower_bound(Node(pos));
	if(it!=st.end()&&it->l==pos) return it;
	it--;
	int L=it->l,R=it->r,V=it->v;
	st.erase(it);
	st.insert(Node(L,pos-1,V));
	return st.insert(Node(pos,R,V)).first;
}
void Assign(int l,int r,int v)
{
	IT itr=Split(r+1);
	IT itl=Split(l);
	st.erase(itl,itr);
	st.insert(Node(l,r,v));
}
void Add(int l,int r,int val)
{
	IT itr=Split(r+1);
	IT itl=Split(l);
	for(IT it=itl;it!=itr;it++) it->v+=val;
}
int Rank(int l,int r,int k)
{
	IT itr=Split(r+1);
	IT itl=Split(l);
	vector<pair<int,int> > vet;
	vet.clear();
	for(IT it=itl;it!=itr;it++){
		vet.push_back(make_pair(it->v,it->r-it->l+1));
	}
	sort(vet.begin(),vet.end());
	VT vt=vet.begin();
	for(int i=0;i<vet.size();i++){
		k-=vet[i].second;
		if(k<=0) return vet[i].first;
	}
	return -1;
}
int Make_Pow(int l,int r,int x,int y)
{
	IT itr=Split(r+1);
	IT itl=Split(l);
	int ans=0;
	for(IT it=itl;it!=itr;it++){
		ans+=(it->r-it->l+1)*Fast_Pow(it->v,x,y)%y;
		ans%=y;
	}
	return ans;
}
int rnd()
{
	int ret=seed;
	seed=(seed*7+13)%MOD;
	return ret;
}
signed main()
{
	n=Read(),m=Read(),seed=Read(),vmax=Read();
	for(int i=1;i<=n;i++){
		int a=rnd()%vmax+1;
		st.insert(Node(i,i,a));
	}
	st.insert(Node(n+1,n+1,0));
	for(int i=1;i<=m;i++){
		int l,r,x,y;
		int 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) Assign(l,r,x);
		else if(op==3) printf("%lld\n",Rank(l,r,x));
		else if(op==4) printf("%lld\n",Make_Pow(l,r,x,y));
	}
	return 0;
}
2021/2/8 15:50
加载中...