此题为什么需要long long 啊?
查看原帖
此题为什么需要long long 啊?
409518
Zzz_yigui楼主2023/11/17 09:54

m<10^6,m*m才10^12,我在每次运算之后都使用取余符号为什么不开long long还是会错?(开long long之后已过)

#include<bits/stdc++.h>
using namespace std;
const long long int md=571373;
long long int n,q,tp,nm[500005],op,opn,t,tt;
struct p{
	long long int s,c,j,r,l;
}tr[500005];
void b(long long int id,long long int l,long long int r){
	tr[id].r=r;tr[id].l=l;
	if(r==l){
		tr[id].s=nm[l];
		return;
	}
	long long int mid=(r+l)>>1;
	b(id*2,l,mid);
	b(id*2+1,mid+1,r);
	tr[id].s=tr[id*2].s+tr[id*2+1].s;
	tr[id].s%=md;
	tr[id].c=1;
}
void ac(long long int id,long long int c){
	tr[id].s*=c;
	tr[id].s%=md;
	tr[id].c*=c;
	tr[id].c%=md;
	tr[id].j*=c;
	tr[id].j%=md;
}
void aj(long long int id,long long int j){
	tr[id].s+=j*(tr[id].r-tr[id].l+1);
	tr[id].s%=md;
	tr[id].j+=j;
	tr[id].j%=md;
}
void sp(long long int id){
	if(tr[id].c!=1){
		ac(id*2,tr[id].c);
		ac(id*2+1,tr[id].c);
		tr[id].c=1;
	}
	if(tr[id].j){
		aj(id*2,tr[id].j);
		aj(id*2+1,tr[id].j);
		tr[id].j=0;
	}
}
long long int dop(long long int id,long long int l,long long int r){   //op=1乘,op=2加,op=3输出, 
	//cout<<l<<" "<<r<<" "<<id<<endl;
	long long int tmp;
	if(l==tr[id].l&&r==tr[id].r){
		if(op==3)return tr[id].s;
		if(op==1){
			ac(id,opn);
			return 0;
		}
		if(op==2){
			aj(id,opn);
			return 0;
		}
	}
	sp(id);
	long long int mid=(tr[id].r+tr[id].l)>>1;
	if(l<=mid){
		if(r<=mid) tmp=dop(id*2,l,r);
		else tmp=dop(id*2,l,mid)+dop(id*2+1,mid+1,r);
	}
	else tmp=dop(id*2+1,l,r);
	tr[id].s=tr[id*2].s+tr[id*2+1].s;
	tr[id].s%=md;
	tmp%=md;
	return tmp;
}
int main(){
	cin>>n>>q>>tp;
	for(int i=1;i<=n;i++)cin>>nm[i];
	b(1,1,n);
	//for(int i=1;i<=4*n;i++) cout<<tr[i].l<<" "<<tr[i].r<<" "<<tr[i].s<<" "<<i<<endl;
	while(q--){
		cin>>op>>t>>tt;
		if(op!=3){
			cin>>opn;
			dop(1,t,tt);
		}
		else cout<<dop(1,t,tt)<<endl;
		//for(int i=1;i<=4*n;i++) cout<<tr[i].l<<" "<<tr[i].r<<" "<<tr[i].s<<" "<<i<<endl;
	}
	return 0;
}
2023/11/17 09:54
加载中...