求助90pts,WA on 10
查看原帖
求助90pts,WA on 10
537046
大眼仔Happy楼主2022/12/3 13:55
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
#define ll long long
const ll mod=1e9+7;
int n,m;
ll a[N];
struct data{ll Sum,SqrSum;};
void exgcd(ll a,ll b,ll &x,ll &y)
{
	if(b==0){x=1;y=0;return;}
	exgcd(b,a%b,y,x);
	y-=(a/b)*x;
}
ll inv(ll x)
{
	ll ansx,ansy;
	exgcd(x,mod,ansx,ansy);
	return (ansx%mod+mod)%mod;
}
struct Segment_Tree
{
	data t[N<<2];
	data SetClear(){data res;res.SqrSum=res.Sum=0;return res;}
	data mix(data x,data y)
	{
		data res=SetClear();
		res.Sum=(x.Sum+y.Sum)%mod;
		res.SqrSum=(x.SqrSum+y.SqrSum)%mod;
		return res;
	}
	void up(int k){t[k]=mix(t[k<<1],t[k<<1|1]);}
	void build(int k,int l,int r)
	{
		if(l==r)
		{
			t[k].Sum=a[l]%mod;
			t[k].SqrSum=(a[l]*a[l])%mod;
			return;
		}
		int mid=(l+r)>>1;
		build(k<<1,l,mid);
		build(k<<1|1,mid+1,r);
		up(k);
	}
	void add(int k,int l,int r,int q,ll v)
	{
		if(l==r)
		{
			t[k].Sum=v%mod;
			t[k].SqrSum=(v*v)%mod;
			return;
		}
		int mid=(l+r)>>1;
		if(q<=mid)add(k<<1,l,mid,q,v);
		else add(k<<1|1,mid+1,r,q,v);
		up(k);
	}
	data ask(int k,int l,int r,int ql,int qr)
	{
		if(ql<=l&&r<=qr)return t[k];
		data res=SetClear();
		int mid=(l+r)>>1;
		if(ql<=mid)res=mix(res,ask(k<<1,l,mid,ql,qr));
		if(qr>mid)res=mix(res,ask(k<<1|1,mid+1,r,ql,qr));
		return res;
	}
	void var(int l,int r)
	{
		data res=ask(1,1,n,l,r);
		ll AnsNume,AnsDeno;
		AnsNume=(res.SqrSum*(r-l+1)-res.Sum*res.Sum);
		AnsNume=(AnsNume%mod+mod)%mod;
		AnsDeno=((r-l+1)*(r-l+1))%mod;
		printf("%lld\n",AnsNume*inv(AnsDeno)%mod);
	}
}T;
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
	T.build(1,1,n);
	while(m--)
	{
		int op;
		scanf("%d",&op);
		if(op==1)
		{
			int q;ll k;
			scanf("%d%lld",&q,&k);
			T.add(1,1,n,q,k);
		}
		if(op==2)
		{
			int l,r;
			scanf("%d%d",&l,&r);
			if(l>r)swap(l,r);
			T.var(l,r);
		}
	}
	return 0;
}
2022/12/3 13:55
加载中...