玄学错误求解释(悬同学的关)
查看原帖
玄学错误求解释(悬同学的关)
717599
dengjunhaodejia09楼主2025/1/18 15:48
#include <bits/stdc++.h>
//#include <bits/extc++.h>
using namespace std;
#define int long long
//__gnu_pbds::gp_hash_table<int,int> ma;
map<pair<int,int> ,int> ma;
int phi(int id){
	int ans=id,vis=0;
	for(int j=2;j*j<=id;j++){
		if(id%j==0){
			ans=ans/j;
			ans*=(j-1);
			vis=1;
			while(id%j==0){
				id/=j;
			}
		}
	}
	if(id>1){
		return ans/id*(id-1);
	}
	return ans;
}
int Ph[1919810],now;
int n,m,p,c;
int kuai_mi(int y,int Mod){
//	if(ma[make_pair(y,Mod)]){
//		return ma[make_pair(y,Mod)];
//	}
	int x=c;
	int ans=1,vis=0;
	while(y){
		if(y&1){
			ans*=x;
		}
		x*=x;
		if(ans>=Mod){
			ans%=Mod;
			vis=1;
		}
		if(x>=Mod && y>1){
			ans%=Mod;
			vis=1;
		}
		x%=Mod;
		y>>=1;
	}
	if(vis){
		ans+=Mod;
	}
	ma[make_pair(y,Mod)]=ans;
	return ans;
}
int P[100005][65];
int a[1919810],sum[1919810];
int tree[1919810],vis[1919810];
void build(int id,int l,int r){
	if(l==r){
		tree[id]=a[l];
		return;
	} 
	int mid=(l+r)/2;
	build(id*2,l,mid);
	build(id*2+1,mid+1,r);
	tree[id]=tree[id*2]+tree[id*2+1];
}
int dfs(int id){
	if(id==1){
		return 1;
	}
	return 1+dfs(phi(id));
}
int ans=0;
int ddfs(int id,int Mod,int ida,int num){
	if(ida==num){
		return kuai_mi(id,Mod);
	}
	int anaa=ddfs(id,Ph[ida],ida+1,num);
	int ans=kuai_mi(anaa,Mod);
	return ans;
}
void change(int id,int l,int r,int L,int R){
	if(L<=l && r<=R && vis[id]){
		return;
	}
	if(l==r){
		sum[l]--;
		tree[id]=ddfs(a[l],p,1,ans-sum[l])%p;
		if(sum[l]==0){
			vis[id]=1;
			return;
		}
		return;
	}
	int mid=(l+r)/2;
	if(R<=mid){
		change(id*2,l,mid,L,R);
	}else if(L>mid){
		change(id*2+1,mid+1,r,L,R);
	}else{
		change(id*2,l,mid,L,R);
		change(id*2+1,mid+1,r,L,R);
	}
	tree[id]=tree[id*2]+tree[id*2+1];
	vis[id]=(vis[id*2]&vis[id*2+1]);
}
int query(int id,int l,int r,int L,int R){
	if(L<=l && r<=R){
		return tree[id];
	}
	int mid=(l+r)/2;
	if(R<=mid){
		return query(id*2,l,mid,L,R);
	}else if(L>mid){
		return query(id*2+1,mid+1,r,L,R);
	} else{
		return (query(id*2,l,mid,L,R)+query(id*2+1,mid+1,r,L,R))%p;
	}
}
signed main(){
	cin>>n>>m>>p>>c;
	int nnn=p;
	while(p){
		if(p==1){
			break;
		}
		p=phi(p);
		Ph[++now]=p;
	}
		Ph[++now]=p;
	p=nnn;
	ans=now;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		sum[i]=ans;
	}
	build(1,1,n);
	for(int i=1;i<=m;i++){
		int opt;
		cin>>opt;
		if(opt==0){
			int l,r;
			cin>>l>>r;
//			for(int j=l;j<=r;j++){
//				sum[j]=max(sum[j]-1,0)
//			}
			change(1,1,n,l,r);
		}else{
			int l,r;
			cin>>l>>r;
			cout<<query(1,1,n,l,r)%p<<'\n';
		}
	}
	
	return 0;
}
//1845808
//1845808

是对的而把


int kuai_mi(int y,int Mod){
//	if(ma[make_pair(y,Mod)]){
//		return ma[make_pair(y,Mod)];
//	}
	int x=c;
	int ans=1,vis=0;
	while(y){
		if(y&1){
			ans*=x;
		}
		x*=x;
		if(ans>=Mod){
			ans%=Mod;
			vis=1;
		}
		if(x>=Mod && y>1){
			ans%=Mod;
			vis=1;
		}
		x%=Mod;
		y>>=1;
	}
	if(vis){
		ans+=Mod;
	}
	ma[make_pair(y,Mod)]=ans;
	return ans;
}

改成


int kuai_mi(int y,int Mod){
	if(ma[make_pair(y,Mod)]){
		return ma[make_pair(y,Mod)];
	}
	int x=c;
	int ans=1,vis=0;
	while(y){
		if(y&1){
			ans*=x;
		}
		x*=x;
		if(ans>=Mod){
			ans%=Mod;
			vis=1;
		}
		if(x>=Mod && y>1){
			ans%=Mod;
			vis=1;
		}
		x%=Mod;
		y>>=1;
	}
	if(vis){
		ans+=Mod;
	}
	ma[make_pair(y,Mod)]=ans;
	return ans;
}

就错了,求解释,如果你帮我找到了问题,我就让同学给你关注

2025/1/18 15:48
加载中...