注意到我们在做这道题之前学习了:

  • 线段树
  • 缩点
  • 矩阵快速幂
  • 二维数点
  • 中国剩余定理
  • 莫队
  • 树链剖分
  • 高斯消元
  • 线性基

所以我们在写代码的时候不需要删除这些模板的代码(会让我们累死),只需要注释即可(不会让我们累死)。

代码如下:

/*

#include<bits/stdc++.h>
#define int long long
#define N 100005
using namespace std;
constexpr int MOD=571373;

int n,m,q;
int op,l,r,x;
array<int,N> a;

struct tree
{
	array<int,N<<2> p;
	array<int,N<<2> t1;
	array<int,N<<2> t2;

	inline void lazy(int rt,int l,int r,int k)
	{
		(p.at(rt)+=(r-l+1)*k%MOD)%=MOD;
		(t1.at(rt)+=k)%=MOD;
	}

	inline void times(int rt,int l,int r,int k)
	{
		(p.at(rt)*=k)%=MOD;
		(t1.at(rt)*=k)%=MOD;
		(t2.at(rt)*=k)%=MOD;
	}

	void push(int rt,int l,int r)
	{
		if(t2.at(rt)!=1)
		{
			int mid=l+r>>1;
			times(rt<<1,l,mid,t2.at(rt) );
			times(rt<<1|1,mid+1,r,t2.at(rt) );
		}
		if(t1.at(rt) )
		{
			int mid=l+r>>1;
			lazy(rt<<1,l,mid,t1.at(rt) );
			lazy(rt<<1|1,mid+1,r,t1.at(rt) );
		}
		t1.at(rt)=0;
		t2.at(rt)=1;
	}

	void build(int rt,int l,int r)
	{
		if(l==r)
		{
			p.at(rt)=a.at(l);
			return;
		}

		int mid=l+r>>1;
		build(rt<<1,l,mid);
		build(rt<<1|1,mid+1,r);
		p.at(rt)=(p.at(rt<<1)+p.at(rt<<1|1) )%MOD;
	}

	void add(int rt,int l,int r,int ql,int qr,int k)
	{
		if(ql<=l && r<=qr)
		{
			lazy(rt,l,r,k);
			return;
		}
		push(rt,l,r);

		int mid=l+r>>1;
		if(ql<=mid) add(rt<<1,l,mid,ql,qr,k);
		if(mid<qr) add(rt<<1|1,mid+1,r,ql,qr,k);
		p.at(rt)=(p.at(rt<<1)+p.at(rt<<1|1) )%MOD;
	}

	void mul(int rt,int l,int r,int ql,int qr,int k)
	{
		if(ql<=l && r<=qr)
		{
			times(rt,l,r,k);
			return;
		}
		push(rt,l,r);

		int mid=l+r>>1;
		if(ql<=mid) mul(rt<<1,l,mid,ql,qr,k);
		if(mid<qr) mul(rt<<1|1,mid+1,r,ql,qr,k);
		p.at(rt)=(p.at(rt<<1)+p.at(rt<<1|1) )%MOD;
	}

	int query(int rt,int l,int r,int ql,int qr)
	{
		if(ql<=l && r<=qr)
		return p.at(rt);
		push(rt,l,r);

		int ret=0;
		int mid=l+r>>1;
		if(ql<=mid) (ret+=query(rt<<1,l,mid,ql,qr)%MOD)%=MOD;
		if(mid<qr) (ret+=query(rt<<1|1,mid+1,r,ql,qr)%MOD)%=MOD;
		return ret;
	}
};

tree t;

signed main()
{
	cin>>n>>q>>m;
	for(int i=1;i<=n;i++)
	scanf("%lld",&a.at(i) );
	t.build(1,1,n);
	t.t2.fill(1);

	while(q--)
	{
		scanf("%lld",&op);
		if(op==1)
		{
			scanf("%lld%lld%lld",&l,&r,&x);
			t.mul(1,1,n,l,r,x);
		}
		else if(op==2)
		{
			scanf("%lld%lld%lld",&l,&r,&x);
			t.add(1,1,n,l,r,x);
		}
		else
		{
			scanf("%lld%lld",&l,&r);
			printf("%lld\n",t.query(1,1,n,l,r)%MOD);
		}
	}
	return 0;
}

#include<bits/stdc++.h>
#define int long long
#define N 105
using namespace std;
constexpr int INF=0x3f3f3f3f3f3f3f3f;
constexpr int MOD=1e9+7;

int n,m;
array<array<int,N>,N> a;

inline void times(array<array<int,N>,N> &x,array<array<int,N>,N> &y)
{
	array<array<int,N>,N> ret={};
	for(int k=1;k<=n;k++)
	for(int i=1;i<=n;i++)
	for(int j=1;j<=n;j++)
	(ret.at(i).at(j)+=x.at(i).at(k)*y.at(k).at(j)%MOD)%=MOD;
	x=ret;
}

inline void pow(array<array<int,N>,N> &a,int y)
{
	array<array<int,N>,N> ret;
	ret=a;
	while(y)
	{
		if(y&1) times(ret,a);
		times(a,a);
		y>>=1;
	}
	a=ret;
}

signed main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	for(int j=1;j<=n;j++)
	scanf("%lld",&a.at(i).at(j) );
	if(m==0)
	{
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++)
			printf("%d ",i==j ? 1:0);
			printf("\n");
		}
		return 0;
	}

	pow(a,m-1);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		printf("%lld ",a.at(i).at(j) );
		printf("\n");
	}
	return 0;
}

#include<bits/stdc++.h>
#define int long long
#define N 2000000
#define f first
#define s second
using namespace std;

struct str
{
	int x;
	int id;
	int val;
};

int n,q;
int x,y,z;
array<int,N+5> a;
array<int,N+5> g;
array<int,N+5> ans;
array<vector<str>,N+5> v;

inline int lowbit(int x)
{
	return x&(-x);
}

inline void add(int x)
{
	for(int i=x;i<=N;i+=lowbit(i) )
	g.at(i)++;
}

inline int query(int x)
{
	int ret=0;
	for(int i=x;i>=1;i-=lowbit(i) )
	ret+=g.at(i);
	return ret;
}

signed main()
{
	cin>>n>>q;
	g.fill(0);
	ans.fill(0);
	for(int i=1;i<=n;i++)
	scanf("%lld",&a.at(i) );

	for(auto &e:v) e.clear();
	for(int i=1;i<=q;i++)
	{
		scanf("%lld%lld%lld",&x,&y,&z);
		v.at(x-1).push_back({z,i,-1});
		v.at(y).push_back({z,i,1});
	}

	for(int i=1;i<=n;i++)
	{
		add(a.at(i) );
		for(const auto &e:v.at(i) )
		ans.at(e.id)+=e.val*query(e.x);
	}

	for(int i=1;i<=q;i++)
	printf("%lld\n",ans.at(i) );
	return 0;
}


#include<bits/stdc++.h>
#define int long long
#define N 91
using namespace std;

int n;
array<int,N> a,b;

int ext(int a,int b,int &x,int &y)
{
	if(!b)
	{
		x=1;
		y=0;
		return a;
	}
	
	int q=ext(b,a%b,x,y);
	
	int t=x;
	x=y;
	y=t-a/b*y;
	return q;
}

int crt(array<int,N> p,array<int,N> q,int k)
{
	int x,y,m;
	int a=0,n=1;
	for(int i=1;i<=k;i++)
	n*=p.at(i);
	
	for(int i=1;i<=k;i++)
	{
		m=n/p.at(i);
		ext(p.at(i),m,x,y);
		a=(a+(__int128)y*m*q.at(i) )%n;
	}
	
	if(a>0) return a;
	else return a+n;
}

signed main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	cin>>a.at(i)>>b.at(i);
	
	cout<<crt(a,b,n)<<endl;
	return 0;
}

#include<bits/stdc++.h>
#define int long long
#define N 50004
#define f first
#define s second
using namespace std;
constexpr int INF=0x3f3f3f3f3f3f3f3f;

struct str
{
	int x;
	int y;
	int id;
};

int n,m,k;
int ans;
array<int,N> a;
array<int,N> p;
array<int,N> ansl;

int q;
int x,y;
int l,r;
array<str,N> s;

inline int to(int x)
{
	return (x-1)/m+1;
}

inline int bl(int x)
{
	return (x-1)*m+1;
}

inline int br(int x)
{
	return min(m*x,n);
}

inline void add(int x)
{
	p.at(a.at(x) )++;
	ans+=p.at(a.at(x) )<<1;
	ans--;
}

inline void del(int x)
{
	p.at(a.at(x) )--;
	ans-=p.at(a.at(x) )<<1;
	ans--;
}

signed main()
{
	cin>>n>>q>>k;
	m=sqrt(n);
	p.fill(0);
	for(int i=1;i<=n;i++)
	scanf("%lld",&a.at(i) );

	for(int i=1;i<=q;i++)
	{
		scanf("%lld%lld",&s.at(i).x,&s.at(i).y);
		s.at(i).id=i;
	}

	sort(s.begin()+1,s.begin()+1+q,[](str &l,str &r)
	{if(to(l.x)==to(r.x) ) return l.y<r.y;
	 else return to(l.x)<to(r.x);});
	l=s.at(1).x,r=s.at(1).y;

	for(int i=l;i<=r;i++)
	p.at(a.at(i) )++;
	for(int i=1;i<=k;i++)
	ans+=p.at(i)*p.at(i);
	ansl.at(s.at(1).id)=ans;

	for(int i=2;i<=q;i++)
	{
		while(l<s.at(i).x) del(l++);
		while(l>s.at(i).x) add(--l);
		while(r<s.at(i).y) add(++r);
		while(r>s.at(i).y) del(r--);
		ansl.at(s.at(i).id)=ans;
	}

	for(int i=1;i<=q;i++)
	printf("%lld\n",ansl.at(i) );
	return 0;
}

#include<bits/stdc++.h>
#define int long long
#define N 100005
#define M 710
#define f first
#define s second
using namespace std;
constexpr int INF=0x3f3f3f3f3f3f3f3f;

int n,r;
int q,op;
int x,y,z;
int cnt,mod;
array<int,N> a;
array<int,N> fa;
array<int,N> dep;
array<int,N> hev;
array<int,N> p,to;
array<int,N> t1,t2;
array<int,N> top,dfn;
array<vector<int>,N> g;

inline int lowbit(int x)
{
	return x&-x;
}

inline void add(array<int,N> &t,int x,int k)
{
	k%=mod;
	for(int i=x;i<=n;i+=lowbit(i) )
	(t.at(i)+=k)%=mod;
}

inline void update(int l,int r,int k)
{
	k%=mod;
	add(t1,l,k);
	add(t1,r+1,(mod-k)%mod);
	add(t2,l,(l%mod)*k%mod);
	add(t2,r+1,(mod-(r+1)%mod*k%mod)%mod);
}

inline int query(int l,int r)
{
	int ret;
	int ret1=0,ret2=0;
	for(int i=r;i>0;i-=lowbit(i) )
	{
		(ret1+=t1.at(i) )%=mod;
		(ret2+=t2.at(i) )%=mod;
	}
	ret=( (r+1)%mod*ret1%mod-ret2+mod)%mod;

	ret1=0,ret2=0;
	for(int i=l-1;i>0;i-=lowbit(i) )
	{
		(ret1+=t1.at(i) )%=mod;
		(ret2+=t2.at(i) )%=mod;	
	}
	ret=(ret-( (l%mod*ret1%mod-ret2+mod)%mod)+mod)%mod;
	return ret;
}

void dfs1(int rt,int f)
{
	p.at(rt)=1;
	fa.at(rt)=f;
	dep.at(rt)=dep.at(f)+1;
	for(const auto &e:g.at(rt) )
	if(e!=f)
	{
		dfs1(e,rt);
		p.at(rt)+=p.at(e);
		if(p.at(hev.at(rt) )<p.at(e) )
		hev.at(rt)=e;
	}
}

void dfs2(int rt,int ft)
{
	dfn.at(rt)=++cnt;
	to.at(cnt)=rt;
	top.at(rt)=ft;
	if(hev.at(rt) )
	dfs2(hev.at(rt),ft);

	for(const auto &e:g.at(rt) )
	if(e!=fa.at(rt) && e!=hev.at(rt) )
	dfs2(e,e);
}

inline int front(int l,int r)
{
	int ret=0;
	while(top.at(l)!=top.at(r) )
	{
		if(dep.at(top.at(l) )<dep.at(top.at(r) ) )
		swap(l,r);
		(ret+=query(dfn.at(top.at(l) ),dfn.at(l) ) )%=mod;
		l=fa.at(top.at(l) );
	}

	if(dep.at(l)>dep.at(r) ) swap(l,r);
	(ret+=query(dfn.at(l),dfn.at(r) ) )%=mod;
	return ret;
}

inline int sons(int x)
{
	return query(dfn.at(x),dfn.at(x)+p.at(x)-1);
}

inline void change(int l,int r,int k)
{
	while(top.at(l)!=top.at(r) )
	{
		if(dep.at(top.at(l) )<dep.at(top.at(r) ) )
		swap(l,r);
		update(dfn.at(top.at(l) ),dfn.at(l),k);
		l=fa.at(top.at(l) );
	}
	if(dep.at(l)>dep.at(r) ) swap(l,r);
	update(dfn.at(l),dfn.at(r),k);
}

inline void covson(int x,int k)
{
	update(dfn.at(x),dfn.at(x)+p.at(x)-1,k);
}

signed main()
{
	cin>>n>>q>>r>>mod;
	for(int i=1;i<=n;i++)
	scanf("%lld",&a.at(i) );
	for(int i=1;i<n;i++)
	{
		scanf("%lld%lld",&x,&y);
		g.at(x).push_back(y);
		g.at(y).push_back(x);
	}

	dfs1(r,0);
	dfs2(r,r);
	for(int i=1;i<=n;i++)
	update(dfn.at(i),dfn.at(i),a.at(i) );
	
	while(q--)
	{
		scanf("%lld",&op);
		if(op==1)
		{
			scanf("%lld%lld%lld",&x,&y,&z);
			change(x,y,z);
		}
		else if(op==2)
		{
			scanf("%lld%lld",&x,&y);
			printf("%lld\n",front(x,y) );
		}
		else if(op==3)
		{
			scanf("%lld%lld",&x,&y);
			covson(x,y);
		}
		else if(op==4)
		{
			scanf("%lld",&x);
			printf("%lld\n",sons(x) );
		}
	}
	return 0;
}

#include<bits/stdc++.h>
#define int long long
#define N 105
#define M 105
using namespace std;
constexpr double zed=1e-9;

int n;
int now,num;
array<array<double,M>,N> a;
array<double,N> ans;

inline int gauss()
{
	now=1;
	// 从当前行开始找绝对值最大的元素 
	for(int i=1;i<=n;i++)
	{
		num=now;
		for(int j=now;j<=n;j++)
		if(fabs(a.at(j).at(i) )>fabs(a.at(num).at(i) ) )
		num=j;
		// 如果当前列全为 0,跳过 
		if(fabs(a.at(num).at(i) )<zed) continue;
		
		// 将最大行交换到当前位置 
		if(num!=now)
		for(int j=1;j<=n+1;j++)
		swap(a.at(now).at(j),a.at(num).at(j) );
		// 主元归一 
		double x=a.at(now).at(i);
		for(int j=1;j<=n+1;j++)
		a.at(now).at(j)/=x;
		
		double fac;
		for(int j=1;j<=n;j++)
		if(j!=now)
		{
			fac=a.at(j).at(i);
			if(fabs(fac)>zed)
			for(int l=1;l<=n+1;l++)
			a.at(j).at(l)-=fac*a.at(now).at(l);
		}
		now++;
	}
	
	// 检查无解  
	bool tr;
	for(int i=now;i<=n;i++)
	{
		tr=true;
		for(int j=1;j<=n;j++)
		if(fabs(a.at(i).at(j) )>zed)
		{
			tr=false;
			break;
		}
		if(tr && fabs(a.at(i).at(n+1) )>zed)
		return -1;
	}
	// 无穷解 
	if(now<=n) return 0;
	
	for(int i=1;i<=n;i++)
	ans.at(i)=a.at(i).at(n+1);
	return 1;
}

signed main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	for(int j=1;j<=n+1;j++)
	scanf("%lf",&a.at(i).at(j) );
	
	if(gauss()<=0) cout<<"No Solution"<<endl;
	else
	for(int i=1;i<=n;i++)
	printf("%.2lf\n",ans.at(i) );
	return 0;
}

*/



#include<bits/stdc++.h>
#define int long long
#define N 100005
using namespace std;



signed main()
{
	freopen("test.out","w",stdout);
	cout<<"Hello"<<", "<<"W"<<"o"<<"r"<<"l"<<"d"+1-1<<"!"<<endl;
	return 0;
}