分块求教卡常
查看原帖
分块求教卡常
223560
_HL_楼主2022/3/17 22:29

卡的心态有点小崩。

#include <bits/stdc++.h>
using namespace std;
#define mod 1000000007
//#define int long long
inline int read()
{
	int x=0;
	char c=getchar();
	while(!isdigit(c))c=getchar();
	while(isdigit(c))
	{
		x=(x<<1)+(x<<3)+(c^48);
		c=getchar();
	}
	return x;
}
int len;
const int N=2e5+3;
const int sqrtN=803;
int a[N];
long long tag[130][130];
long long tagb[sqrtN];
int bid[N],bl[sqrtN],br[sqrtN];
inline void add(int x,int dx)
{
	tagb[bid[x]]+=dx;
	tagb[bid[x]]%=mod;
	a[x]+=dx;
	a[x]%=mod;
}
inline long long query(int l,int r)
{
	long long res=0;
	if(bid[l]==bid[r])
	{
		for(int i=l;i<=r;i++)res=res+a[i];
	}
	else
	{
		for(int i=bid[l]+1;i<bid[r];i++)res+=tagb[i];
		for(int i=l;i<=br[bid[l]];i++)res+=a[i];
		for(int i=bl[bid[r]];i<=r;i++)res+=a[i];
	}
	return res;
}
void write(int x) 
{
	if(x>9)write(x/10);
	putchar(x%10+'0');
}
signed main()
{
	//freopen("in.txt","r",stdin);
	//freopen("out.txt","w",stdout);
	int n=read(),m=read();
	for(int i=1;i<=n;i++)a[i]=read();
	int s=100;
    int len=300;
	for(int i=1;i<=n;i++)
	{
		bid[i]=(i-1)/len+1;
		tagb[bid[i]]+=a[i];
		if(bid[i]!=bid[i-1])
		{
			bl[bid[i]]=i;
			tagb[bid[i-1]]%=mod;
			br[bid[i-1]]=i-1;
		}
	}
	tagb[bid[n]]%=mod;
	int x,y,z,l,r;
	long long ans;
	while(m--)
	{
		int opt=read();
		if(opt==1)
		{
			x=read(),y=read(),z=read();
			if(x<=s)for(int j=y;j<=x;j++)tag[x][j]=(tag[x][j]+z)%mod;
			else
			for(int j=y;j<=n;j+=x)add(j,z);
		}
		else
		{
			l=read(),r=read();
			ans=query(l,r);
			for(int j=1;j<=s;j++)
			{
				ans=ans+1ll*r/j*tag[j][j]%mod+tag[j][r%j];
				ans=ans+mod*2-1ll*(l-1)/j*tag[j][j]%mod-tag[j][(l-1)%j];
			}
			ans=ans%mod;
			write(ans);
			putchar('\n');
		}
	}
	return 0;
}
2022/3/17 22:29
加载中...