求助线性筛欧拉函数莫名炸掉
  • 板块学术版
  • 楼主Name1
  • 当前回复4
  • 已保存回复4
  • 发布时间2022/8/9 15:48
  • 上次更新2023/10/27 16:17:10
查看原帖
求助线性筛欧拉函数莫名炸掉
648660
Name1楼主2022/8/9 15:48

运行到find_euler函数时炸了

#include<iostream>
#include<cstdio>
#define lson x<<1,l,mid
#define rson x<<1|1,mid+1,r
#define ll long long
#define euler eu
using namespace std;
const int N=5e5+10,M=2e7+10;
int n,m;
ll g[N<<2],d[N<<2];
inline int read()
{
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9')x=x*10+c-48,c=getchar();
	return x*f;
}
inline void pushup(int x){g[x]=g[x<<1]+g[x<<1|1];}
inline void build(int x,int l,int r)
{
	if(l==r)
	{
		g[x]=read();
		return;
	}
	int mid=(l+r)>>1;
	build(lson);
	build(rson);
	pushup(x);
}
inline void andd(int x,int l,int r,int dd){d[x]=dd,g[x]+=(r-l+1)*dd;}
inline void pushdown(int x,int l,int r,int mid)
{
	if(!d[x]) return;
	andd(lson,d[x]);
	andd(rson,d[x]);
	d[x]=0;
}
inline void update(int x,int l,int r,int ql,int qr,int k)
{
	if(ql>r||qr<l) return;
	if(ql<=l&&r<=qr) 
	{
		d[x]+=k,g[x]+=(r-l+1)*k;
		return;
	}
	int mid=(l+r)>>1;
	pushdown(x,l,r,mid);
	update(lson,ql,qr,k);
	update(rson,ql,qr,k);
	pushup(x);
}
inline ll query(int x,int l,int r,int ql,int qr)
{
	if(ql>r||qr<l) return 0;
	if(ql<=l&&r<=qr) return g[x];
	int mid=(l+r)>>1;
	pushdown(x,l,r,mid);
	return query(lson,ql,qr)+query(rson,ql,qr);
}
bool flag=false;
inline ll ksm(ll a,ll b,ll p)
{
	ll res=1;
	while(b)
	{
		if(b) res*=a;
		a*=a,b>>=1;
		if(a>=p) flag=true,a%=p;
		if(res>=p) flag=true,res%=p;
	}
	return res;
}
int is_prime[N],prime[M],eu[N],t;
inline void find_euler()
{
	is_prime[1]=1;
	for(register int i=2;i<=M;i++)
	{
		if(!is_prime[i]) prime[++t]=i,eu[i]=i-1;
		for(register int j=1;j<=t&&i*prime[j]<=M;j++)
		{
			is_prime[i*prime[j]]=1;
			if(i%prime[j]) eu[i*prime[j]]=eu[i]*eu[prime[j]];
			else
			{
				eu[i*prime[j]]=eu[i]*prime[j];
				break;
			}
		}
	}
}
inline ll solve(int l,int r,int t)
{
	if(l==r) return query(1,1,n,r,r);
	if(t==1) return 0;
	int ans=solve(l+1,r,eu[t]);
	if(!flag&&ans<eu[t]) return ksm(query(1,1,n,l,l),ans,t);
	else
	{
		flag=false;
		return ksm(query(1,1,n,l,l),ans%eu[t]+eu[t],t); 
	} 
}
signed main()
{
	n=read(),m=read();
	build(1,1,n);
	find_euler();
	while(m--)
	{
		int opp=read(),l=read(),r=read(),x=read();
		if(opp==1) update(1,1,n,l,r,x);
		else       printf("%lld\n",solve(l,r,x));
	}
	return 0;
}
2022/8/9 15:48
加载中...