Anby_の模板题集

洛谷版
博客备份版。

普及-

B3647 【模板】Floyd

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
const int N=2e2+10,inf=0x3f3f3f3f,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
int n,m,dp[N][N];
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(i!=j) dp[i][j]=inf;
	for(int i=1;i<=m;i++){
		int u,v,w;
		cin>>u>>v>>w;
		dp[u][v]=dp[v][u]=min(dp[u][v],w);
	}
	for(int k=1;k<=n;k++){
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){		
				dp[i][j]=dp[j][i]=min(dp[i][j],dp[i][k]+dp[k][j]);
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++) cout<<dp[i][j]<<" ";
		cout<<endl;
	}
	return 0;
}

B3614 【模板】栈

#include<bits/stdc++.h>
#define int unsigned long long
#define x first
#define y second
using namespace std;
const int N=2e5+10,inf=0x3f3f3f3f,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/

int t,x,n,head,q[N];
string op;
signed main(){
	cin.tie(0);
    ios::sync_with_stdio(false);
	cin>>t;
	while(t--){
		cin>>n;
		head=0;
		while(n--){
			cin>>op;
			if(op=="push"){
				cin>>x;
				q[++head]=x;
			}
			if(op=="pop"){
				if(!head) cout<<"Empty\n";
				else head--;
			}
			if(op=="query"){
				if(!head) cout<<"Anguei!\n";
				else cout<<q[head]<<endl;
			}
			if(op=="size") cout<<head<<endl;
		}
	}
	return 0;
}

P1177 【模板】排序

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
const int N=2e5+10,inf=0x3f3f3f3f,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
int a[N],n;
void quickSort(int l,int r){
	if(l>=r) return;
	int x=a[l],i=l,j=r;
	while(i<j){
		while(a[j]>=x&&i<j) j--;
		while(a[i]<=x&&i<j) i++;
		swap(a[i],a[j]);
	}
	a[l]=a[i],a[i]=x;
	quickSort(l,i-1);
	quickSort(i+1,r);
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	sort(a+1,a+n+1);
	for(int i=1;i<=n;i++) cout<<a[i]<<" ";
	return 0;
}

P3383 【模板】线性筛素数

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
const int N=1e8+10,inf=0x3f3f3f3f,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
int primes[N],cnt,m,T;
bool vis[N];
void init(int n){
	for(int i=2;i<=n;i++){
		if(!vis[i]) primes[++cnt]=i;
		for(int j=1;j<=cnt&&i*primes[j]<=n;j++){
			vis[i*primes[j]]=1;
			if(i%primes[j]==0) break;
		}
	}
} 
int main(){
	cin>>m>>T;
	init(m);
	while(T--){
		cin>>m;
		cout<<primes[m]<<endl;
	}
	return 0;
}

P1226 【模板】快速幂

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
const int N=2e5+10,inf=0x3f3f3f3f,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
int a,b,p;
ll quickMi(int a,int b){
	ll ans=1,bit=a;
	while(b>0){
		if(b&1) ans=(ans*bit)%p;
		bit=(bit*bit)%p;
		b>>=1;
	}
	return ans%p;
}
int main(){
	cin>>a>>b>>p;
	printf("%d^%d mod %d=%lld",a,b,p,quickMi(a,b));
	return 0;
}

P3370 【模板】字符串哈希

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
const int N=5e6+10,M=105,inf=0x3f3f3f3f;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
ull mod=212370440130137957ll,prime=117517,base=131,ans=1,a[N];
string s;
ull hashl(string s){
	int size=s.size();
	ull ans=0;
	for(int i=0;i<size;i++) ans=(ans*base+(ull)s[i])%mod+prime;
	return ans;
}
int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>s;
		a[i]=hashl(s);
	}
	sort(a+1,a+n+1);
	for(int i=1;i<n;i++) if(a[i]!=a[i+1]) ans++;
	cout<<ans;
	return 0;
}

B3644 【模板】拓扑排序 / 家谱树

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
const int N=2e5+10,inf=0x3f3f3f3f,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
int deg[N],n,head[N],edge[N],last[N],idx;
void add(int u,int v){
	edge[++idx]=v;
	last[idx]=head[u];
	head[u]=idx;
}
void kahn(){
	queue<int> q;
	for(int i=1;i<=n;i++) if(!deg[i]) q.push(i);
	while(!q.empty()){
		int t=q.front(); q.pop();
		cout<<t<<" ";
		for(int i=head[t];i;i=last[i]){
			int v=edge[i]; deg[v]--;
			if(!deg[v]) q.push(v);
		}
	}
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		int c=0;
		while(cin>>c&&c){
			deg[c]++;
			add(i,c);
		}
	}
	kahn();
	return 0;
}

普及/提高-

P3378 【模板】堆

#include<bits/stdc++.h>
#define f(x) ((x)/2)
#define l(x) (x*2)
#define r(x) (x*2+1)
#define x first
#define y second
using namespace std;
const int N=1e6+10,inf=0x3f3f3f3f,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
int cnt,heap[N];
void push(int x){
	int pos=++cnt;
	while(pos>1){
		if(heap[f(pos)]<=x) break;
		heap[pos]=heap[f(pos)],pos=f(pos);
	}
	heap[pos]=x;
}
void pop(){
	int pos=1,x=heap[cnt--];
	while(l(pos)<=cnt){
		int son=(heap[l(pos)]<heap[r(pos)]?l(pos):r(pos));
		if(heap[son]>=x) break;
		heap[pos]=heap[son],pos=son;
	}
	heap[pos]=x;
}
void op() {cout<<heap[1]<<endl;}
int main(){
	int n;
	cin>>n;
	while(n--){
		int opt,v1;
		cin>>opt;
		if(opt==1) cin>>v1,push(v1);
		else if(opt==3) pop();
		else op();
	}
	return 0;
}

P3865 【模板】ST 表 && RMQ 问题

#include<bits/stdc++.h>
#define int long long
#define x first
#define y second
using namespace std;
const int N=2e5+10,inf=0x3f3f3f3f,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
int lg2[N];
int n,q,a[N];
int f[N][30];
signed main(){
	cin>>n>>q;
	for(int i=1;i<=n;i++) scanf("%lld",a+i);
	for(int i=2;i<=n;i++) lg2[i]=lg2[i>>1]+1;
	for(int i=1;i<=n;i++) f[i][0]=a[i];
	for(int j=1;j<=30;j++)
		for(int i=1;i<=n-(1<<j)+1;i++)
			f[i][j]=max(f[i][j-1],f[i+(1ll<<(j-1))][j-1]);
	while(q--){
		int l,r;
		scanf("%lld%lld",&l,&r);
		int lg=lg2[r-l+1];
		int mx=max(f[l][lg],f[r-(1ll<<lg)+1][lg]);
		cout<<mx<<"\n";
	}
	return 0;
}

B3611 【模板】传递闭包

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
const int N=2e2+10,inf=0x3f3f3f3f,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
int n,m,dp[N][N];
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			cin>>dp[i][j];
	for(int k=1;k<=n;k++){
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){		
				dp[i][j]|=dp[i][k]&dp[k][j];
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++) cout<<dp[i][j]<<" ";
		cout<<endl;
	}
	return 0;
}

P3811 【模板】模意义下的乘法逆元

怎么还卡常捏???

#include<bits/stdc++.h>
#define int long long
#define x first
#define y second
using namespace std;
const int N=3e6+10,inf=0x3f3f3f3f,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
int inv[N],n,p;
void Pre(){
	inv[1]=1;
	for(int i=2;i<=n;i++) inv[i]=(p-p/i)*inv[p%i]%p;
}
signed main(){
	cin>>n>>p;
	Pre();
	for(int i=1;i<=n;i++) printf("%d\n",inv[i]);
	return 0;
}

P3367 【模板】并查集

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
const int N=2e5+10,inf=0x3f3f3f3f,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
int n,t,F[N];
int find(int x){
	if(F[x]==x) return x;
	return F[x]=find(F[x]);
}
int main(){
	cin>>n>>t;
	for(int i=1;i<=n;i++) F[i]=i;
	while(t--){
		int v1,v2,v3;
		cin>>v1>>v2>>v3;
		if(v1==1) F[find(v2)]=F[find(v3)];
		else cout<<(F[find(v2)]==F[find(v3)]?"Y":"N")<<endl;
	}
	return 0;
}

P5788 【模板】单调栈

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
const int N=3e6+10,inf=0x3f3f3f3f,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
int n,a[N],stk[N],x,top,xiabiao[N];
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>x;
		while(stk[top]<x) a[xiabiao[top]]=i,top--;
		stk[++top]=x,xiabiao[top]=i;
	}
	for(int i=1;i<=n;i++) cout<<a[i]<<" ";
	return 0;
}

P3371 【模板】单源最短路径(弱化版)

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
const int N=5e5+10,inf=-1+(1<<31),mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
int head[N],edge[N],last[N],W[N],idx;
void add(int u,int v,int w){
	W[++idx]=w;
	edge[idx]=v;
	last[idx]=head[u];
	head[u]=idx;
}
int inq[N],d[N],n,m,s;
void SPFA(int st){
	for(int i=1;i<=n;i++) d[i]=inf;
	queue<int> q;
	d[st]=0,inq[st]=1; q.push(st);
	while(!q.empty()){
		int u=q.front(); q.pop(); inq[u]=0;
		for(int i=head[u],v;i;i=last[i]){
			v=edge[i];
			if (d[v]>d[u]+W[i]){
				d[v]=d[u]+W[i];
				if(!inq[v]) q.push(v);
				inq[v]=1;
			}
		}
	}
}
int main(){
	cin>>n>>m>>s;
	for(int i=1;i<=m;i++){
		int u,v,w;
		cin>>u>>v>>w;
		add(u,v,w);
	}
	SPFA(s);
	for(int i=1;i<=n;i++) cout<<d[i]<<" ";
	return 0;
}

P3366 【模板】最小生成树

#include<bits/stdc++.h>
#define int long long 
#define x first
#define y second
using namespace std;
const int N=5e5+10,inf=0x3f3f3f3f,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
struct Node{int u,v,w;}edge[N];
bool cmp(Node x,Node y){return x.w<y.w;}
int n,m,f[N];
int find(int x){
	if(x==f[x]) return x;
	return f[x]=find(f[x]);
}
void kruskal(){
	sort(edge+1,edge+m+1,cmp);
	for(int i=1;i<=n;i++) f[i]=i;
	int ans=0,cnt=0;
	for(int i=1;i<=m;i++){
		if(cnt==n-1) break;
		int u=find(edge[i].u),v=find(edge[i].v);
		if(u==v) continue;
		ans+=edge[i].w,cnt++,f[u]=v;
	}
	if(cnt==n-1) cout<<ans;
	else cout<<"orz";
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++) cin>>edge[i].u>>edge[i].v>>edge[i].w;
	kruskal();
	return 0;
}

P4779 【模板】单源最短路径(标准版)

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
const int N=5e5+10,inf=2147483647,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
int W[N],head[N],edge[N],last[N],idx,d[N];
void add(int u,int v,int w){
	W[++idx]=w;
	edge[idx]=v;
	last[idx]=head[u];
	head[u]=idx;
}
int n,m,s;
bool vis[N];
void dijsktra(int st){
	priority_queue<pii,vector<pii>,greater<pii> > q;
	q.push({0,st});
	for(int i=1;i<=n;i++) d[i]=inf;
	d[st]=0;
	while(!q.empty()){
		pii t=q.top(); q.pop();
		if(vis[t.y]) continue;
		vis[t.y]=1;
		for(int i=head[t.y];i;i=last[i]){
			int v=edge[i];
			if(d[v]>d[t.y]+W[i]) d[v]=d[t.y]+W[i],q.push({d[v],v});
		}
	}
}
int main(){
	cin>>n>>m>>s;
	for(int i=1;i<=m;i++){
		int u,v,w;
		cin>>u>>v>>w;
		add(u,v,w);
	}
	dijsktra(s);
	for(int i=1;i<=n;i++) cout<<d[i]<<" ";
	return 0;
}

P3379 【模板】最近公共祖先(LCA)

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
const int N=5e5+10,inf=0x3f3f3f3f,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
int fa[N][20],deep[N],head[2*N],edge[2*N],last[2*N],idx,n,m,root;
void add(int u,int v){
	edge[++idx]=v;
	last[idx]=head[u];
	head[u]=idx;
}
void dfs(int x,int father){
	deep[x]=deep[father]+1;
	fa[x][0]=father;
	for(int i=1;(1<<i)<=deep[x];i++) fa[x][i]=fa[fa[x][i-1]][i-1];
	for(int i=head[x];i;i=last[i]) if(edge[i]!=father) dfs(edge[i],x);
}
int LCA(int x,int y){
	if(deep[x]<deep[y]) swap(x,y);
	for(int i=19;i>=0;i--) if(deep[x]-(1<<i)>=deep[y]) x=fa[x][i];
	if(x==y) return x;
	for(int i=19;i>=0;i--){
		if(fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i];
	}
	return fa[x][0];
}
int main(){
	cin>>n>>m>>root;
	for(int i=1;i<n;i++){
		int u,v;
		cin>>u>>v;
		add(u,v);
		add(v,u);
	}
	dfs(root,0);
	for(int i=1;i<=m;i++){
		int u,v;
		cin>>u>>v;
		cout<<LCA(u,v)<<endl;
	}
	return 0;
}

P3385 【模板】负环

多测不清空,爆零两行泪。

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
const int N=5e5+10,inf=0x3f3f3f3f,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
int head[N],edge[N],last[N],W[N],idx;
void add(int u,int v,int w){
	W[++idx]=w;
	edge[idx]=v;
	last[idx]=head[u];
	head[u]=idx;
}
int inq[N],len[N],d[N],n,m,s;
bool SPFA(int st){
	for(int i=1;i<=n;i++) d[i]=inf;
	queue<int> q;
	d[st]=0,inq[st]=1; q.push(st);
	while(!q.empty()){
		int u=q.front(); q.pop(); inq[u]=0;
		for(int i=head[u],v;i;i=last[i]){
			v=edge[i];
			if (d[v]>d[u]+W[i]){
				d[v]=d[u]+W[i];
				len[v]=len[u]+1;
				if(len[v]>=n) return 1;
				if(!inq[v]) q.push(v);
				inq[v]=1;
			}
		}
	}
	return 0;
}
void init(){
	memset(head,0,sizeof(head));
	memset(edge,0,sizeof(edge));
	memset(last,0,sizeof(last));
	memset(inq,0,sizeof(inq));
	memset(len,0,sizeof(len));
	memset(W,0,sizeof(W));
	idx=0;
}
int main(){
	int T;
	cin>>T;
	while(T--){
		init();
		cin>>n>>m;
		for(int i=1;i<=m;i++){
			int u,v,w;
			cin>>u>>v>>w;
			add(u,v,w);
			if(w>=0) add(v,u,w);
		}
		cout<<(SPFA(1)?"YES":"NO")<<"\n";
	}
	
	return 0;
}

普及+/提高

P3388 【模板】割点(割顶)

#include<bits/stdc++.h> 
#define x first
#define y second
using namespace std;
const int N=2e5+10,inf=0x3f3f3f3f,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
int head[N],edge[N],last[N],idx;
void add(int u,int v){
	edge[++idx]=v;
	last[idx]=head[u];
	head[u]=idx;
}
int low[N],dfn[N],prt[N],mark[N],tot,sonCount,rt;
void Tarjan(int u){
	low[u]=dfn[u]=++tot;
	for(int i=head[u];i;i=last[i]){
		int v=edge[i];
		if(prt[u]==v) continue;
		//printf("            %d -> %d \n- dfn[u]=%d   low[u]=%d   prt[u]=%d\n- dfn[v]=%d   low[v]=%d   prt[v]=%d\n\n\n",u,v,dfn[u],low[u],prt[u],dfn[v],low[v],prt[v]);
		if(!dfn[v]){
			prt[v]=u;
			Tarjan(v);
			low[u]=min(low[u],low[v]);
			if(low[v]>=dfn[u]){
				//cout<<u<<endl;
				mark[u]=1;
				if(u==rt) sonCount++;
			}
		}
		else low[u]=min(low[u],dfn[v]);
	}
	if(sonCount==1) mark[rt]=0;
}
int n,m;
int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int u,v;
		cin>>u>>v;
		add(u,v);
		add(v,u);
	}
	for(int i=1;i<=n;i++) if(!dfn[i]) rt=i,sonCount=0,Tarjan(i);
	int ans=0;
	for(int i=1;i<=n;i++) if(mark[i]) ans++;
	cout<<ans<<endl;
	for(int i=1;i<=n;i++) if(mark[i]) cout<<i<<" ";
	return 0;
}

P3387 【模板】缩点

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
const int N=2e5+10,inf=0x3f3f3f3f,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
pii edge[N];
int U[N],V[N],p[N],d[N];
struct Graph{
	int head[N*2],edge[N*2],last[N*2],inq[N*2],W[N*2],idx;
	void add(int u,int v){
		inq[v]++;
		edge[++idx]=v;
		last[idx]=head[u];
		head[u]=idx;
	}
	void add(int u,int v,int w)
		{W[idx+1]=w,add(u,v);}
}g1,g2;
stack<int> s;
int dfn[N],low[N],ins[N],bel[N],cnt[N],Ot[N],a[N],SCC,tot;
void Tarjan(int u){
	dfn[u]=low[u]=++tot;
	s.push(u);ins[u]=1;
	for(int i=g1.head[u];i;i=g1.last[i]){
		int v=g1.edge[i];
		if(dfn[v]==0){
			Tarjan(v);
			low[u]=min(low[u],low[v]);
		}else if(ins[v])low[u]=min(low[u],dfn[v]);
	}
	if(dfn[u]==low[u]){
		SCC++;
		while(true){
			int t=s.top();s.pop();
			bel[t]=SCC;
			p[SCC]+=a[t];
			ins[t]=0;
			if(t==u)break;
		}
	}
}
int n,m;
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=m;i++){
		cin>>U[i]>>V[i];
		g1.add(U[i],V[i]);
	}
	for(int i=1;i<=n;i++) if(!dfn[i]) Tarjan(i);
	for(int i=1;i<=m;i++) edge[i]={bel[U[i]],bel[V[i]]};
	sort(edge+1,edge+m+1);
	for(int i=1;i<=m;i++){
		int u=edge[i].x,v=edge[i].y;
		if(u==v||edge[i]==edge[i-1]) continue;
		g2.add(u,v);
	}
	queue<int> q;
	for(int i=1;i<=SCC;i++) if(!g2.inq[i]) q.push(i);
	while(!q.empty()){
		int u=q.front(); q.pop();
		d[u]+=p[u];
		for(int i=g2.head[u];i;i=g2.last[i]){
			int v=g2.edge[i]; g2.inq[v]--;
			d[v]=max(d[v],d[u]);
			if(!g2.inq[v]) q.push(v);
		}
	}
	int ans=0; 
	for(int i=1;i<=SCC;i++) ans=max(ans,d[i]);
	cout<<ans;
	return 0;
}

P3374 【模板】树状数组 1

#include<bits/stdc++.h>
#define lowbit(x) ((x)&-(x))
#define x first
#define y second
using namespace std;
const int N=5e5+10,inf=0x3f3f3f3f,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
int tree[N]={0};
void update(int x,int d){
	while(x<=N){
		tree[x]+=d;
		x+=lowbit(x);
	}
}
int sum(int x){
	int ans=0;
	while(x>0){
		ans+=tree[x];
		x-=lowbit(x);
	}
	return ans;
}
int a[N];
int main(){
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		update(i,a[i]);
	}
	while(m--){
		int op,x,y;
		cin>>op>>x>>y;
		if(op==1) update(x,y);
		else cout<<sum(y)-sum(x-1)<<endl;
	}
	return 0;
}

P2197 【模板】Nim 游戏

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
const int N=2e5+10,inf=0x3f3f3f3f,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
int x,sum,t,n;
int main(){
	cin>>t;
	while(t--){
		cin>>n;
		sum=0;
		for(int i=1;i<=n;i++){
			cin>>x;
			sum^=x;
		}
		cout<<(sum?"Yes":"No")<<endl;
	}
	return 0;
}

P3372 【模板】线段树 1

#include<bits/stdc++.h>
#define ls(x) ((x)<<1)
#define rs(x) ((x)<<1|1)
#define x first
#define y second
using namespace std;
const int N=2e5+10,inf=0x3f3f3f3f,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
ll a[N],tree[N<<2],tag[N<<2];
void push_up(ll p){
	tree[p]=tree[ls(p)]+tree[rs(p)];
	//(-  ^  -)/
}
void build(ll p,ll pl,ll pr){
	tag[p]=0;
	if(pl==pr){tree[p]=a[pl];return;}
	ll mid=(pl+pr)>>1;
	build(ls(p),pl,mid);
	build(rs(p),mid+1,pr);
	push_up(p);
}
void addtag(ll p,ll pl,ll pr,ll d){ //lazy_tag
	tag[p]+=d;
	tree[p]+=d*(pr-pl+1);
} 
void push_down(ll p,ll pl,ll pr){
	if(tag[p]){
		ll mid=(pl+pr)>>1;
		addtag(ls(p),pl,mid,tag[p]);
		addtag(rs(p),mid+1,pr,tag[p]);
		tag[p]=0;
	}
}
void update(ll l,ll r,ll p,ll pl,ll pr,ll d){
	if(l<=pl&&pr<=r){
		addtag(p,pl,pr,d);
		return;
	}
	push_down(p,pl,pr);
	ll mid=(pl+pr)>>1;
	if(l<=mid) update(l,r,ls(p),pl,mid,d);
	if(r>mid) update(l,r,rs(p),mid+1,pr,d);
	push_up(p);
}
ll query(ll l,ll r,ll p,ll pl,ll pr){
	if(pl>=l&&r>=pr) return tree[p];
	push_down(p,pl,pr);
	ll res=0,mid=(pl+pr)>>1;
	if(l<=mid) res+=query(l,r,ls(p),pl,mid);
	if(r>mid) res+=query(l,r,rs(p),mid+1,pr);
	return res;
}
int main(){
	ll n,m;
	cin>>n>>m;
	for(ll i=1;i<=n;i++) cin>>a[i];
	build(1,1,n);
	while(m--){
		ll q,l,r,d;
		cin>>q;
		if(q==1){
			cin>>l>>r>>d;
			update(l,r,1,1,n,d);
		}
		else{
			cin>>l>>r;
			cout<<query(l,r,1,1,n)<<endl;
		}
	}
	return 0;
}

P3373 【模板】线段树 2

#include<bits/stdc++.h>
#define int long long
#define x first
#define y second
using namespace std;
const int N=2e5+10,inf=0x3f3f3f3f,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
int m; 
struct SEG{
	int tree[N*4],tgp[N*4],tgm[N*4],a[N];
	void pu(int x) {tree[x]=(tree[x<<1]+tree[x<<1|1])%m;}
	void pd(int x,int l,int r){
		if(tgm[x]!=1){
			tree[x<<1]=tree[x<<1]*tgm[x]%m,tree[x<<1|1]=tree[x<<1|1]*tgm[x]%m;
			tgp[x<<1]=tgp[x<<1]*tgm[x]%m,tgp[x<<1|1]=tgp[x<<1|1]*tgm[x]%m;
			tgm[x<<1]=tgm[x<<1]*tgm[x]%m,tgm[x<<1|1]=tgm[x<<1|1]*tgm[x]%m;
			tgm[x]=1;
		}
		if(tgp[x]){
			int mid=(l+r)>>1;
			tree[x<<1]+=(mid-l+1)*tgp[x];
			tree[x<<1|1]+=(r-mid)*tgp[x];
			tgp[x<<1]+=tgp[x],tgp[x<<1|1]+=tgp[x];
			tgp[x]=0;
		}
	}
	void bld(int x,int l,int r){
		if(l>r) return; tgm[x]=1;
		if(l==r) return tree[x]=a[l],void();
		int mid=(l+r)>>1;
		bld(x<<1,l,mid);
		bld(x<<1|1,mid+1,r);
		pu(x);
	}
	void updp(int x,int l,int r,int ql,int qr,int d){
		if(l>r) return; pd(x,l,r);
		if(ql<=l&&r<=qr) return tree[x]+=(r-l+1)*d,tgp[x]+=d,void();
		int mid=(l+r)>>1;
		if(ql<=mid) updp(x<<1,l,mid,ql,qr,d);
		if(mid<qr)  updp(x<<1|1,mid+1,r,ql,qr,d);
		pu(x);
	}
	void updm(int x,int l,int r,int ql,int qr,int d){
		if(l>r) return;pd(x,l,r);
		if(ql<=l&&r<=qr) return tree[x]=tree[x]*d%m,tgm[x]*=d,void(); 
		int mid=(l+r)>>1;
		if(ql<=mid) updm(x<<1,l,mid,ql,qr,d);
		if(mid<qr)  updm(x<<1|1,mid+1,r,ql,qr,d);
		pu(x);
	}
	int qry(int x,int l,int r,int ql,int qr){
		if(l>r) return 0;
		if(ql<=l&&r<=qr) return tree[x];
		pd(x,l,r);
		int mid=(l+r)>>1,res=0;
		if(ql<=mid) res+=qry(x<<1,l,mid,ql,qr);
		if(mid<qr)  res+=qry(x<<1|1,mid+1,r,ql,qr);
		return res%m;
	}
}tr;
int n,q; 
signed main(){
	cin>>n>>q>>m;
	for(int i=1;i<=n;i++) cin>>tr.a[i];
	tr.bld(1,1,n);
	while(q--){
		int opt,x,y,k;
		cin>>opt>>x>>y;
		if(opt==3) cout<<tr.qry(1,1,n,x,y)<<"\n";
		if(opt==1) cin>>k,tr.updm(1,1,n,x,y,k);
		if(opt==2) cin>>k,tr.updp(1,1,n,x,y,k);
	}
	return 0;
}

P5905 【模板】全源最短路(Johnson)

#include<bits/stdc++.h>
#define int long long
#define x first
#define y second
using namespace std;
const int N=2e5+10,inf=1e9,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
int head[N],edge[N],last[N],W[N],idx;
void add(int u,int v,int w){
	W[++idx]=w;
	edge[idx]=v;
	last[idx]=head[u];
	head[u]=idx;
}

int check[N],n,m;
bool vis[N],book[N];
int inq[N],len[N],d[N],dist[N];
bool spfa(int st){
	for(int i=1;i<=n;i++) d[i]=inf;
	queue<int> q;
	d[st]=0,inq[st]=1; q.push(st);
	while(!q.empty()){
		int u=q.front(); q.pop(); inq[u]=0;
		for(int i=head[u],v;i;i=last[i]){
			v=edge[i];
			if (d[v]>d[u]+W[i]){
				d[v]=d[u]+W[i];
				len[v]=len[u]+1;
				if(len[v]>n) return 1;
				if(!inq[v]) q.push(v);
				inq[v]=1;
			}
		}
	}
	return 0;
}
void dijsktra(int st){
	priority_queue<pii,vector<pii>,greater<pii> > pq;
	for(int i=1;i<=n;i++) dist[i]=inf;
	memset(vis,0,sizeof(vis));
	
	dist[st]=0;
	pq.push({0,st});
	while(!pq.empty()){
		pii top=pq.top(); pq.pop();
		int u=top.y,d=top.x;
		if(vis[u]) continue;
		vis[u]=1;
		
		for(int i=head[u];i;i=last[i]){
			int v=edge[i],w=W[i];
			
			if(dist[v]<=dist[u]+w) continue;
			dist[v]=dist[u]+w;
			pq.push({dist[v],v});
		}
	}
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int u,v,w;
		cin>>u>>v>>w;
		add(u,v,w);
	}
	
	for(int i=1;i<=n;i++) add(0,i,0);
	if(spfa(0)) return cout<<-1,0;
	for(int u=1;u<=n;u++) for(int i=head[u];i;i=last[i]) W[i]=W[i]+d[u]-d[edge[i]];
	
	for(int u=1;u<=n;u++){
		dijsktra(u);
		
		int ans=0;
		for(int v=1;v<=n;v++) ans+=v*(dist[v]==inf?inf:dist[v]+d[v]-d[u]);
		
		cout<<ans<<endl;
	}
	return 0;
}

P3390 【模板】矩阵快速幂

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
const int N=110,inf=0x3f3f3f3f,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
struct Node{
	ll v[N][N];
}ans,a,b,c;
ll n=2,m=2,k=2,l,p;
Node mul(Node a,Node b){
	Node c;
	for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) c.v[i][j]=0;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			for(int l=1;l<=n;l++) c.v[i][j]=(c.v[i][j]+a.v[i][l]*b.v[l][j]%mod)%mod;
		}
	}
	return c;
}
Node quickMi(Node a,ll l){
	Node ans;
	for(int i=1;i<=n;i++) ans.v[i][i]=1;
	while(l){
		if(l&1) ans=mul(ans,a);
		a=mul(a,a),l>>=1;	
	}
	return ans;
}
int main(){
	cin>>n>>l;
	for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cin>>a.v[i][j];
	for(int i=1;i<=n;i++) ans.v[i][i]=1;
	ans=quickMi(a,l);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cout<<ans.v[i][j]<<" ";
		}
		cout<<endl;
	}
	return 0;
} 

P1939 矩阵加速(数列)

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
const int N=110,inf=0x3f3f3f3f,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*
[1 0 1]
[1 0 0]
[0 1 0]
*/
struct Node{
	ll v[N][N];
}a;
ll n=3,m=3,k=3,l,p;
Node mul(Node a,Node b){
	Node c;
	for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) c.v[i][j]=0;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			for(int l=1;l<=n;l++) c.v[i][j]=(c.v[i][j]+a.v[i][l]*b.v[l][j]%mod)%mod;
		}
	}
	return c;
}
Node quickMi(Node a,ll l){
	Node ans;
	for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) ans.v[i][j]=0;
	for(int i=1;i<=n;i++) ans.v[i][i]=1;
	while(l){
		if(l&1) ans=mul(ans,a);
		a=mul(a,a),l>>=1;	
	}
	return ans;
}
int main(){
	int t;
	cin>>t;
	a.v[1][1]=a.v[1][2]=a.v[2][3]=a.v[3][1]=1;
	while(t--){
		cin>>l;
		Node ans=quickMi(a,l);
		cout<<ans.v[1][2]<<endl;
	}
	return 0;
} 

P1439 【模板】最长公共子序列

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
const int N=2e5+10,inf=0x3f3f3f3f,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
int n,f[N],a[N],b[N],mp[N],len;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i],mp[a[i]]=i;
	for(int i=1;i<=n;i++) cin>>b[i],f[i]=inf;
	for(int i=1;i<=n;i++){
		if(mp[b[i]]>f[len]) f[++len]=mp[b[i]];
		else{
			int l=1,r=len,ans;
			while(l<=r){
				int mid=(l+r)>>1;
				if(f[mid]>mp[b[i]]) r=mid-1,ans=mid;
				else l=mid+1;
			}
			f[ans]=min(mp[b[i]],f[ans]);
		}
	}
	cout<<len;
	return 0;
}

P5960 【模板】差分约束

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
const int N=5e5+10,inf=0x3f3f3f3f,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
int head[N],edge[N],last[N],W[N],idx;
void add(int u,int v,int w){
	W[++idx]=w;
	edge[idx]=v;
	last[idx]=head[u];
	head[u]=idx;
}
int inq[N],len[N],d[N],n,m,s,C,flag;
ll ans;
bool SPFA(){
	queue<int> q;
	for(int i=1;i<=n;i++){
		inq[i]=1;
		q.push(i);
	}
	while(!q.empty()){
		int u=q.front(); q.pop(); inq[u]=0;
		for(int i=head[u],v;i;i=last[i]){
			v=edge[i];
			if (d[v]<d[u]+W[i]){
				d[v]=d[u]+W[i];
				C=min(C,d[v]);
				len[v]=len[u]+1;
				if(len[v]>=n) return 1;
				if(!inq[v]) q.push(v);
				inq[v]=1;
			}
		}
	}
	return 0;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int u,v,w;
		cin>>u>>v>>w;
		add(u,v,-w);
	}
	if(flag||SPFA()) return cout<<"NO",0;
	for(int i=1;i<=n;i++) cout<<d[i]-C<<" ";
	return 0;
}

P3386 【模板】二分图最大匹配

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
const int N=2e5+10,inf=0x3f3f3f3f,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
int n,m,e;
int head[N],edge[N],last[N],idx;
void add(int u,int v){
	edge[++idx]=v;
	last[idx]=head[u];
	head[u]=idx;
}
bool vis[N];
int match[N];
bool fndpth(int u){
	for(int i=head[u],v;i;i=last[i]){
		v=edge[i];
		if(!vis[v]){
			vis[v]=1;
			if(!match[v]||fndpth(match[v])){
				match[v]=u;
				return 1;
			}
		}
	}
	return 0;
}
int mxMtch(){
	int ans=0;
	memset(match,0,sizeof match);
	for(int u=1;u<=n;u++){
		memset(vis,0,sizeof vis);
		if(fndpth(u)) ans++;
	}
	return ans;
}
int main(){
	cin>>n>>m>>e;
	for(int i=1;i<=e;i++){
		int u,v;
		cin>>u>>v;
		add(u,v+n);
		add(v+n,u);
	}
	cout<<mxMtch();
	return 0;
}

P3375 【模板】KMP

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
const int N=2e6+10,inf=0x3f3f3f3f,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
string a,b;
int nxt[N],n,m,cur;
void prepare(){
	nxt[1]=0; cur=0;
	for(int i=2;i<=n;i++){
		while(cur&&a[cur+1]!=a[i]) cur=nxt[cur];
		if(a[cur+1]==a[i]) nxt[i]=++cur;
		else nxt[i]=0;
	}
}
int main(){
	cin>>b>>a; n=a.size(),m=b.size();
	a=' '+a; b=' '+b;
	prepare();
	cur=0;
	for(int i=1;i<=m;i++){
		while(cur>0&&a[cur+1]!=b[i]) cur=nxt[cur];
		if(a[cur+1]==b[i]) cur++;
		if(cur==n) cout<<i-n+1<<endl;
	}
	for(int i=1;i<=n;i++) cout<<nxt[i]<<" ";
	return 0;
}

P1962 斐波那契数列

只是想存一下好看的代码。

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
const int N=1e2+10,inf=0x3f3f3f3f,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
struct Matrix
{
	int row , col;
	ll ml [N][N];
	
	void init ()
	{
		for ( int i = 1; i <= row; i++)
			for( int j = 1; j <= col; j++)
				ml [i][j] = 0;
	}
	
	void SetUnit ( int l )
	{
		row = col = l;
		for ( int i = 1; i <= l; i++)
			ml[i][i] = 1;
	}
	
	void SetFib ()
	{
		row = col = 2;
		ml [2][2] = 0;
		ml [1][1] = ml [1][2] = ml [2][1] =1;
	}
	
	void output ()
	{
		printf("row = %d ; col = %d ;\n",row ,col);
		
		for ( int i = 1; i <= row; i++)
		{
			for( int j = 1; j <= col; j++)
				cout << ml [i][j] << " ";
			cout << endl;
		}
	}
	
	Matrix operator * ( const Matrix & a ) const
	{
		Matrix ans;
		ans .row = a. row;
		ans .col =    col;
		ans .init ();
		
		for (int i = 1; i <= a .row; i++)
			for (int j = 1; j <=    col; j++)
				for (int k = 1; k <= a .col; k++) 
					ans .ml [i][j] = ( ans .ml [i][j] + ( a .ml [i][k] * ml [k][j] ) % mod ) % mod;
		
		return ans;
	}
	
};

Matrix operator ^ ( const Matrix & Ma , const ll & Mb)
{
	Matrix ans , a = Ma;
	ans .row = a .row;
	ans .col = a .col;
	ans .SetUnit (2); 
	ll b = Mb;
	
	while ( b )
	{
		if ( b & 1 ) ans = a * ans;
		a = a * a , b >>= 1;
	}
	
	return ans;
}
Matrix tot;
int main ()
{
	tot .SetFib();
	ll l;
	cin >> l;
	tot = tot ^ l;
	cout << tot .ml[1][2];
	return 0;
}

提高+/省选-

P3812 【模板】线性基

#include<bits/stdc++.h>
#define int long long
#define x first
#define y second
using namespace std;
const int N=2e5+10,inf=0x3f3f3f3f,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
int ans;
int n,m=60,a[N],p[N];
void insert(int x){
	for(int i=m;~i;i--){
		if(!((x>>i)&1ll)) continue;
		if(!p[i]) return p[i]=x,void();
		x^=p[i]; 
	}
	return;
}
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i],insert(a[i]);
	for(int i=m;~i;i--) ans=max(ans,ans^p[i]);
	cout<<ans;
	return 0;
}

P4782 【模板】2-SAT

#include<bits/stdc++.h>
#define nx(x) ((((x)-1)^1)+1)
#define x first
#define y second
using namespace std;
const int N=2e6+10,inf=0x3f3f3f3f,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
int head[N],edge[N],last[N],idx;
void add(int u,int v){
	edge[++idx]=v;
	last[idx]=head[u];
	head[u]=idx;
}
int dfn[N],low[N],ins[N],bel[N],cnt[N],Ot[N],SCC,tot;
stack<int> s;
void Tarjan(int u){
	dfn[u]=low[u]=++tot;
	s.push(u);ins[u]=1;
	for(int i=head[u];i;i=last[i]){
		int v=edge[i];
		if(dfn[v]==0){
			Tarjan(v);
			low[u]=min(low[u],low[v]);
		}else if(ins[v])low[u]=min(low[u],dfn[v]);
	}
	if(dfn[u]==low[u]){
		SCC++;
		while(true){
			int t=s.top();s.pop();
			bel[t]=SCC;
			cnt[SCC]++;
			ins[t]=0;
			if(t==u)break;
		}
	}
}
int n,m;
int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int u,v,a,b;
		cin>>u>>a>>v>>b;
		add(u*2-a,v*2-1+b);
		add(v*2-b,u*2-1+a);
	}
	for(int i=1;i<=n*2;i++) if(!dfn[i]) Tarjan(i);
	for(int i=1;i<=n;i++) if(bel[i*2]==bel[i*2-1]) return cout<<"IMPOSSIBLE",0;
	cout<<"POSSIBLE\n";
	for(int i=1;i<=n;i++){
		if(bel[i*2-1]>bel[i*2]) cout<<1<<" ";
		else cout<<0<<" ";
	}
	return 0;
}

P5490 【模板】扫描线&&矩形面积并

#include<bits/stdc++.h>
#define int long long
#define lc (x<<1)
#define rc (x<<1|1)
#define x first
#define y second
using namespace std;
const int N=2e5+10,inf=0x3f3f3f3f,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
int tot,n,Ls[N],Lsn;
struct seg{
	ll l,r,mn,cnt,add;
}t[N*8];
void pushUp(ll x){
	t[x].mn=min(t[lc].mn,t[rc].mn);
	t[x].cnt=0;
	if(t[x].mn==t[lc].mn)t[x].cnt+=t[lc].cnt;
	if(t[x].mn==t[rc].mn)t[x].cnt+=t[rc].cnt;
}

void pushAdd(ll x,ll add){
	t[x].mn+=add;
	t[x].add+=add;
}

void pushDown(ll x){
	if(t[x].add!=0){
		pushAdd(lc,t[x].add);
		pushAdd(rc,t[x].add);
		t[x].add=0;
	}
}
void Build(ll x,ll l,ll r){
	t[x].l=l;t[x].r=r;
	if(l==r){
		t[x].cnt=Ls[l+1]-Ls[l];
		t[x].mn=0;
		return;
	}
	ll mid=(l+r)>>1;
	Build(lc,l,mid);
	Build(rc,mid+1,r);
	pushUp(x);
}
void Add(ll x,ll l,ll r,ll add){
	if(l<=t[x].l&&t[x].r<=r){
		pushAdd(x,add);
		return;
	}
	pushDown(x);
	ll mid=(t[x].l+t[x].r)>>1;
	if(l<=mid)Add(lc,l,r,add);
	if(r>mid)Add(rc,l,r,add);
	pushUp(x);
}
ll Sum(){
	if(t[1].mn==0)return Ls[Lsn]-Ls[1]-t[1].cnt;
	return Ls[Lsn]-Ls[1];
}
struct Real{
	int x1,y1,x2,y2;
}r[N];
struct Bound{
	int flag,h,l,r;
}B[N];
bool cmp(Bound x,Bound y){return x.h<y.h;}
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>r[i].x1;
		cin>>r[i].y1;
		cin>>r[i].x2;
		cin>>r[i].y2;
		Ls[++Lsn]=r[i].x1;
		Ls[++Lsn]=r[i].x2;
	}
	sort(Ls+1,Ls+Lsn+1);
	Lsn=unique(Ls+1,Ls+Lsn+1)-Ls-1;
	for(ll i=1;i<=n;i++){
		r[i].x1=lower_bound(Ls+1,Ls+Lsn+1,r[i].x1)-Ls;
		r[i].x2=lower_bound(Ls+1,Ls+Lsn+1,r[i].x2)-Ls;
		B[++tot]=(Bound){1,r[i].y1,r[i].x1,r[i].x2};
		B[++tot]=(Bound){-1,r[i].y2,r[i].x1,r[i].x2};
	}
	sort(B+1,B+tot+1,cmp);
	Build(1,1,Lsn-1);
	
	ll ans=0;
	for(ll i=1;i<=tot;i++){
		if(i>1) ans+=(B[i].h-B[i-1].h)*Sum();
		Add(1,B[i].l,B[i].r-1,B[i].flag);
	}
	cout<<ans;
	return 0;
}

P3389 【模板】高斯消元法

#include<bits/stdc++.h>
#define int long long
#define x first
#define y second
using namespace std;
const int N=1e2+10,inf=0x3f3f3f3f,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
const double eps=1e-7;
struct Mat{
	int n,m;
	double mx[N][N];
	void chk(){
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++)
				cout<<mx[i][j]<<" ";
			cout<<"\n";
		}
		cout<<"\n";
	}
	void gk(int i,double k) {for(int x=1;x<=m;x++) mx[i][x]/=k;} 
	void sw(int i,int j) {if(i==j) return;for(int x=1;x<=m;x++) swap(mx[i][x],mx[j][x]);}
	void ad(int i,int j,double k) {if(!i||!j||i==j) return;for(int x=1;x<=m;x++) mx[j][x]+=k*mx[i][x];}
	void gs(){
		for(int i=1,l=1;i<=m&&l<=n;i++){
			double f=0; int ans=0;
			for(int j=l;j<=n;j++) 
				if(fabs(mx[j][i])>fabs(f)) ans=j,f=mx[j][i];
			if(fabs(f)<eps) continue; sw(l,ans);gk(l,f);
			for(int j=1;j<=n;j++) ad(l,j,-mx[j][i]);++l;
		}
	}
}M;
int n;
signed main(){
	cin>>n; M.n=n,M.m=n+1;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n+1;j++)
			cin>>M.mx[i][j];
	M.gs();
	if(fabs(M.mx[n][n])<eps) return cout<<"No Solution",0;
	for(int i=1;i<=n;i++) printf("%.2lf\n",M.mx[i][n+1]); 
	return 0;
}

P3919 【模板】可持久化线段树 1(可持久化数组)

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
const int N=2e6+10,inf=0x3f3f3f3f,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
int n,m,a[N];
struct seg{
	int lc,rc,v;
}t[N*30];
int tot,rt[N];
void build(int &x,int l,int r){
	x=++tot;
	if(l==r) {t[x].v=a[l];return;};
	int mid=(l+r)>>1;
	build(t[x].lc,l,mid);
	build(t[x].rc,mid+1,r);
}
int query(int x,int l,int r,int pos){
	if(l==r) return t[x].v;
	int mid=(l+r)>>1;
	if(pos<=mid) return query(t[x].lc,l,mid,pos);
	else return         query(t[x].rc,mid+1,r,pos);
}
void insert(int &x,int lastx,int l,int r,int p,int v){
	t[x=++tot]=t[lastx];
	if(l==r) {t[x].v=v;return;}
	int mid=(l+r)>>1;
	if(p<=mid) insert(t[x].lc,t[lastx].lc,l,mid,p,v);
	else       insert(t[x].rc,t[lastx].rc,mid+1,r,p,v);
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++) scanf("%d",a+i);
	build(rt[0],1,n);
	for(int i=1,ver,op,p,v;i<=m;i++){
		scanf("%d%d",&ver,&op);
		if(op==1){
			scanf("%d%d",&p,&v);
			insert(rt[i],rt[ver],1,n,p,v);
		}
		else{
			scanf("%d",&p);
			cout<<query(rt[ver],1,n,p)<<endl;
			rt[i]=rt[ver];
		}
	}
	return 0;
}

P3834 【模板】可持久化线段树 2

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
const int N=2e6+10,inf=0x3f3f3f3f,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
int n,m,a[N];
struct seg{
	int lc,rc,v,siz;
}t[N*30];
int tot,rt[N];
void build(int &x,int l,int r){
	x=++tot;
	if(l==r) {t[x].v=a[l];return;};
	int mid=(l+r)>>1;
	build(t[x].lc,l,mid);
	build(t[x].rc,mid+1,r);
}
int nodeSize(int xl,int xr){return t[xr].siz-t[xl].siz;}
int query(int xl,int xr,int l,int r,int k){
	if(l==r) return l;
	int mid=(l+r)>>1,siz=nodeSize(t[xl].lc,t[xr].lc);
	if(k<=siz) return query(t[xl].lc,t[xr].lc,l,mid,k);
	else return query(t[xl].rc,t[xr].rc,mid+1,r,k-siz);
}
void insert(int &x,int lastx,int l,int r,int p){
	t[x=++tot]=t[lastx],t[x].siz++;
	if(l==r) return;
	int mid=(l+r)>>1;
	if(p<=mid) insert(t[x].lc,t[lastx].lc,l,mid,p);
	else       insert(t[x].rc,t[lastx].rc,mid+1,r,p);
}
int mna=INT_MAX,mxa=0;
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i],mna=min(mna,a[i]),mxa=max(mxa,a[i]);
	for(int i=1;i<=n;i++) insert(rt[i],rt[i-1],mna,mxa,a[i]);
	for(int i=1,l,r,k;i<=m;i++){
		cin>>l>>r>>k;
		cout<<query(rt[l-1],rt[r],mna,mxa,k)<<endl;
	}
	return 0;
}

P5787 二分图 /【模板】线段树分治

#include<bits/stdc++.h>
#define int long long
#define x first
#define y second
using namespace std;
const int N=2e6+10,inf=0x3f3f3f3f,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
stack<pii> stk;
int f[N*2],sz[N*2];
struct Edg{int u,v;}edg[N];
int find(int x) {return x==f[x]?x:find(f[x]);}
void merge(int u,int v){
	u=find(u),v=find(v);
	if(u==v) return;
	if(sz[u]>sz[v]) swap(u,v);
	f[u]=v,sz[v]+=sz[u],stk.push({u,v});
}
void undo(){
	pii top=stk.top(); stk.pop();
	int u=top.x,v=top.y;
	f[u]=u,sz[v]-=sz[u];
}
vector<int> tree[N*4];
void upd(int x,int l,int r,int ql,int qr,int d){
	if(ql<=l&&r<=qr) return tree[x].push_back(d),void();
	int mid=(l+r)>>1;
	if(ql<=mid) upd(x<<1,l,mid,ql,qr,d);
	if(mid<qr)  upd(x<<1|1,mid+1,r,ql,qr,d);
}
int n,m,k;
void Solve(int x,int l,int r){
	int lt=stk.size(),ans=1;
	for(int e:tree[x]){
		int u=edg[e].u,v=edg[e].v;
		if(find(u)==find(v)){
			for(int i=l;i<=r;i++) cout<<"No\n";
			ans=0; break; 
		}
		merge(u+n,v),merge(u,v+n);
	}
	if(ans){
		if(l==r) return puts("Yes"),void();
		int mid=(l+r)>>1;
		Solve(x<<1,l,mid);
		Solve(x<<1|1,mid+1,r);
	}
	while(stk.size()!=lt) undo();
}
signed main(){
	cin>>n>>m>>k;
	while(m--){
		int u,v,l,r;
		cin>>u>>v>>l>>r;
		edg[m]={u,v};
		upd(1,1,k,l+1,r,m);
	}
	for(int i=1;i<=n*2;i++) f[i]=i,sz[i]=1;
	Solve(1,1,k);
	return 0;
}

P3369 【模板】普通平衡树

这并不普通。

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
const int N=2e5+10,inf=0x3f3f3f3f,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
int ch[N][2],fa[N],val[N],siz[N],num[N];
int tot,rt,n;

void visitVal(int x){
	if(ch[x][0])visitVal(ch[x][0]);
	if(val[x]!=inf&&val[x]!=-inf){
		cout<<val[x];
		if(num[x]>1) cout<<"("<<num[x]<<")";
		cout<<" ";
	}
	else if(val[x]==inf)           cout<<"+inf\n";
	else                           cout<<"-inf ";
	if(ch[x][1])visitVal(ch[x][1]);
}

void visitNum(int x){
	if(ch[x][0])visitNum(ch[x][0]);
	cout<<num[x]<<" ";
	if(ch[x][1])visitNum(ch[x][1]);
}

void pushUp(int x){
	siz[x]=siz[ch[x][0]]+siz[ch[x][1]]+num[x];
}

void rotate(int x,int &f){
	int y=fa[x],z=fa[y],L=(ch[y][0]!=x),R=(L^1);
	if(y==f)f=x;else if(ch[z][0]==y)ch[z][0]=x;else ch[z][1]=x;
	fa[x]=z;fa[y]=x;fa[ch[x][R]]=y;
	ch[y][L]=ch[x][R];ch[x][R]=y;
	pushUp(y);pushUp(x);
}

void Splay(int x,int &f){
	while(x!=f){
		int y=fa[x],z=fa[y];
		if(y!=f){
			if((ch[y][0]==x)^(ch[z][0]==y))rotate(x,f);
			else rotate(y,f);
		}
		rotate(x,f);
	}
}
void init(){
	rt=1;tot=2;
	fa[2]=1;ch[1][1]=2;
	val[1]=-inf;
	val[2]=+inf;
	siz[2]=1;num[1]=1;
	siz[1]=2;num[2]=1;
}

int insert(int& x,int f,int v){
	if(!x){x=++tot;val[x]=v;siz[x]=num[x]=1;fa[x]=f;return x;}
	if(val[x]==v){num[x]++;return x;}
	else if(val[x]<v)return insert(ch[x][1],x,v);
	else return insert(ch[x][0],x,v);
}

void insert(int v){
	int x=insert(rt,0,v);
	Splay(x,rt);
}

int findPrev(){
	int x=ch[rt][0];
	while(ch[x][1])x=ch[x][1];
	return x;
}

int findNext(){
	int x=ch[rt][1];
	while(ch[x][0])x=ch[x][0];
	return x;
}

int find(int x,int v){
	if(val[x]==v)return x;
	if(val[x]>v)return find(ch[x][0],v);
	return find(ch[x][1],v);
}

void remove(int v){
	int x=find(rt,v);
	Splay(x,rt);
	if(num[x]>1){
		num[x]--;
		return;
	}
	int prev=findPrev();
	int next=findNext();
	Splay(prev,rt);
	Splay(next,ch[rt][1]);
	ch[next][0]=fa[x]=0;
	pushUp(next);pushUp(prev);
}

int queryRank(int v){
	insert(v);
	int x=find(rt,v);
	Splay(x,rt);
	int ans=siz[ch[x][0]];
	remove(v);
	return ans;
}

int findKth(int x,int k){
	if(siz[ch[x][0]]>=k)return findKth(ch[x][0],k);
	if(siz[ch[x][0]]+num[x]>=k)return x;
	return findKth(ch[x][1],k-siz[ch[x][0]]-num[x]);
}
int findKth(int k){
	return val[findKth(rt,k+1)];
}

int findPre(int v){
	insert(v);
	int prev=findPrev();
	int ans=val[prev];
	remove(v);
	return ans;
}

int findNxt(int v){
	insert(v);
	int next=findNext();
	int ans=val[next];
	remove(v);
	return ans;
}

int main(){
	init();
	scanf("%d",&n);
	while(n--){
		int opt,x;
		scanf("%d%d",&opt,&x);
		if(opt==1) insert(x);
		if(opt==2) remove(x);
		if(opt==3) cout<<queryRank(x)<<endl;
		if(opt==4) cout<<findKth(x)<<endl;
		if(opt==5) cout<<findPre(x)<<endl;
		if(opt==6) cout<<findNxt(x)<<endl;
	}
	return 0;
}

P6136 【模板】普通平衡树(数据加强版)

FHQ

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
const int N=2e6+10,inf=2e9,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
int n,m,tot,rt,lst,t,ans;
struct Node {int val,key,siz,ls,rs;}tr[N];
int nw(int x) {tr[++tot]={x,rand(),1}; return tot;}
void pushUp(int x) {tr[x].siz=tr[tr[x].ls].siz+tr[tr[x].rs].siz+1;}
void Split(int p,int &x,int &y,int k){
	if(!p) return x=y=0,void();
	if(tr[p].val<=k) x=p,Split(tr[p].rs,tr[p].rs,y,k);
	else y=p,Split(tr[p].ls,x,tr[p].ls,k);
	pushUp(p);
}
int merge(int u,int v){
	if(!u||!v) return u+v;
	if(tr[u].key<tr[v].key) return tr[u].rs=merge(tr[u].rs,v),pushUp(u),u;
	return tr[v].ls=merge(u,tr[v].ls),pushUp(v),v;
}
void insert(int k){
	int x,y;
	Split(rt,x,y,k);
	rt=merge(merge(x,nw(k)),y);
}
void remove(int v){
	int x,y,z;
	Split(rt,x,y,v);
	Split(x,x,z,v-1);
	z=merge(tr[z].ls,tr[z].rs);
	rt=merge(merge(x,z),y);
}
int find(int v){
	int x,y,ans;
	Split(rt,x,y,v-1);
	ans=tr[x].siz+1;
	merge(x,y);
	return ans;
}
int findKth(int x,int v){
	if(tr[tr[x].ls].siz==v-1) return tr[x].val;
	if(tr[tr[x].ls].siz>v-1) return findKth(tr[x].ls,v);
	return findKth(tr[x].rs,v-1-tr[tr[x].ls].siz);
}
int findPre(int v){
	int x,y,ans;
	Split(rt,x,y,v-1);
	ans=findKth(x,tr[x].siz);
	merge(x,y);
	return ans;
}
int findNxt(int v){
	int x,y,ans;
	Split(rt,x,y,v);
	ans=findKth(y,1);
	merge(x,y);
	return ans;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++) scanf("%d",&t),insert(t);
	while(m--){
		int opt,x;
		scanf("%d%d",&opt,&x);
		x=x^lst;
		if(opt==1) insert(x);
		else if(opt==2) remove(x);
		else if(opt==3) lst=find(x);
		else if(opt==4) lst=findKth(rt,x);
		else if(opt==5) lst=findPre(x);
		else if(opt==6) lst=findNxt(x);
		if(opt>2) ans^=lst;
	}
	printf("%d",ans);
	return 0;
}

P3391 【模板】文艺平衡树

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
const int N=1e6+10,inf=2e9,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
int n,m,tot,rt,lst,t,ans;
struct Node {int val,key,siz,ls,rs,lazy;}tr[N];
int nw(int x) {tr[++tot]={x,rand(),1}; return tot;}
void pushDn(int x) {if(tr[x].lazy) swap(tr[x].ls,tr[x].rs),tr[tr[x].ls].lazy^=1,tr[tr[x].rs].lazy^=1,tr[x].lazy=0;}
void pushUp(int x) {tr[x].siz=tr[tr[x].ls].siz+tr[tr[x].rs].siz+1;}
void Split(int p,int &x,int &y,int k){
	if(!p) return x=y=0,void(); pushDn(p);
	if(tr[tr[p].ls].siz+1<=k) x=p,Split(tr[p].rs,tr[p].rs,y,k-tr[tr[p].ls].siz-1);
	else y=p,Split(tr[p].ls,x,tr[p].ls,k);
	pushUp(p);
}
int merge(int u,int v){
	if(!u||!v) return u+v;
	if(tr[u].key<tr[v].key) return pushDn(u),tr[u].rs=merge(tr[u].rs,v),pushUp(u),u;
	return pushDn(v),tr[v].ls=merge(u,tr[v].ls),pushUp(v),v;
}
void insert(int k){
	int x,y;
	Split(rt,x,y,k);
	rt=merge(merge(x,nw(k)),y);
}
void print(int x){
	if(!x) return;
	pushDn(x);
	print(tr[x].ls);
	cout<<tr[x].val<<" ";
	print(tr[x].rs);
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++) insert(i);
	while(m--){
		int l,r,p,x,y;
		cin>>x>>y;
		Split(rt,l,r,y);
		Split(l,l,p,x-1);
		tr[p].lazy^=1;
		rt=merge(merge(l,p),r);
	}
	print(rt);
	return 0;
}

P5829 【模板】失配树

从 1 开始啊啊啊啊啊啊aaaa!!!!!
KMP+LCA

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
const int N=2e6+10,inf=0x3f3f3f3f,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
string a,b;
int nxt[N],n,m,cur;
int fa[N][25],deep[N],head[2*N],edge[2*N],last[2*N],idx,root;
void add(int u,int v){
	edge[++idx]=v;
	last[idx]=head[u];
	head[u]=idx;
}
int LCA(int x,int y){
	if(deep[x]<deep[y]) swap(x,y);
	for(int i=19;~i;i--) if(deep[x]-(1<<i)>=deep[y]) x=fa[x][i];
	if(x==y) return x;
	for(int i=19;~i;i--)
		if(fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i];
	return fa[x][0];
}
void prepare(){
	nxt[1]=0; cur=0;
	for(int i=2;i<=n;i++){
		while(cur&&a[cur+1]!=a[i]) cur=nxt[cur];
		if(a[cur+1]==a[i]) nxt[i]=++cur;
		else nxt[i]=0;
	}
	for(int u=1;u<=n;u++){
		fa[u][0]=nxt[u];
		deep[u]=deep[nxt[u]]+1;
		for(int i=1;i<=19;i++) fa[u][i]=fa[fa[u][i-1]][i-1];
	}
}
int main(){
	cin>>a; n=a.size();
	a=" "+a;
	prepare();
	cin>>m;
	while(m--){
		int u,v;
		cin>>u>>v;
		cout<<LCA(fa[u][0],fa[v][0])<<endl;
	}
	return 0;
}

P4525 【模板】自适应辛普森法 1

我是积分大佬。

#include<bits/stdc++.h>
#define int long long
#define x first
#define y second
using namespace std;
const int N=2e5+10,inf=0x3f3f3f3f,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
double a,b,c,d,l,r,ans;
signed main(){
	cin>>a>>b>>c>>d>>l>>r; 
	if(a==0) ans=c/2/b*(r*r-l*l)+d/b*(r-l);
	else ans=c*(r-l)/a+(-c*b/a+d)*log((a*r+b)/(a*l+b))/a;
	printf("%.6lf",ans);
	return 0;
}

P7112 【模板】行列式求值

#include<bits/stdc++.h>
#define int long long
#define x first
#define y second
using namespace std;
const int N=8e2+10,inf=0x3f3f3f3f;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
int mod;
int qm(int a,int b){
	int res=1;
	while(b){
		if(b&1) res=(res*a)%mod;
		a=a*a%mod,b>>=1;
	} 
	return res;
}
const double eps=1e-7;
struct Mat{
	int n,m,res=1,a[N][N];
	int det(){
		int l=1,w=1;
		for(int i=1;i<=n;i++){
			for(int j=i+1;j<=n;j++){
				while(a[i][i]){
					int div=a[j][i]/a[i][i];
					for(int k=i;k<=n;k++) a[j][k]=(a[j][k]-div*a[i][k]%mod+mod)%mod;
					swap(a[i],a[j]),w=-w;
				}
				swap(a[i],a[j]); w=-w;
			}
		}
		for(int i=1;i<=n;i++) res=(res*a[i][i])%mod;
		return (res*w+mod)%mod;
	}
}M;
int n;
signed main(){
	cin>>n>>mod; M.n=n,M.m=n;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			cin>>M.a[i][j];
	cout<<M.det();
	return 0;
}

P3384 【模板】重链剖分/树链剖分

#include<bits/stdc++.h>
#define int long long
#define ls(x) (x)<<1
#define rs(x) (x)<<1|1
#define x first
#define y second
using namespace std;
const int N=2e5+10,inf=0x3f3f3f3f,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
struct Graph{
	int head[N*2],edge[N*2],last[N*2],inq[N*2],W[N*2],idx;
	void add(int u,int v){
		inq[v]++;
		edge[++idx]=v;
		last[idx]=head[u];
		head[u]=idx;
	}
	void add(int u,int v,int w)
		{W[idx+1]=w,add(u,v);}
}g;
struct SEG{
	int tree[N*4],a[N],tag[N*4];
	void pushup(int x) {tree[x]=tree[ls(x)]+tree[rs(x)];}
	void addtag(int x,int l,int r,int v) {tag[x]+=v,tree[x]+=v*(r-l+1);}
	void build(int p,int pl,int pr){
		if(pl==pr) return tree[p]=a[pl],void();
		int mid=(pl+pr)>>1;
		build(ls(p),pl,mid);
		build(rs(p),mid+1,pr);
		pushup(p);
	}
	void pushdn(int x,int l,int r){
		if(tag[x]){
			int mid=(l+r)>>1;
			addtag(ls(x),l,mid,tag[x]);
			addtag(rs(x),mid+1,r,tag[x]);
			tag[x]=0;
		}
	}
	void upd(int l,int r,int pl,int pr,int p,int v){
		if(pr<l||pl>r) return;
		if(l<=pl&&pr<=r) return addtag(p,pl,pr,v),void();
		int mid=(pl+pr)>>1;
		pushdn(p,pl,pr);
		upd(l,r,pl,mid,ls(p),v);
		upd(l,r,mid+1,pr,rs(p),v);
		pushup(p);
	}
	int qry(int l,int r,int pl,int pr,int p){
		if(l<=pl&&pr<=r) return tree[p];
		pushdn(p,pl,pr);
		int mid=(pl+pr)>>1,res=0;
		if(l<=mid) res+=qry(l,r,pl,mid,ls(p));
		if(mid<r)  res+=qry(l,r,mid+1,pr,rs(p));
		return res;
	}
}tr;
int n,m,r,p,wt[N];
int mson[N],dep[N],f[N],siz[N];
void dfs1(int u,int fa){
	dep[u]=dep[fa]+1;
	f[u]=fa,siz[u]=1;
	int ms=-1;
	for(int i=g.head[u];i;i=g.last[i]){
		int v=g.edge[i];
		if(v==fa) continue;
		dfs1(v,u);
		siz[u]+=siz[v];
		if(siz[v]>ms) ms=siz[v],mson[u]=v;
	}
}
int top[N],id[N],cnt;
void dfs2(int u,int tf){
	id[u]=++cnt;
	top[u]=tf;
	tr.a[cnt]=wt[u];
	if(!mson[u]) return; 
	dfs2(mson[u],tf);
	for(int i=g.head[u];i;i=g.last[i]){
		int v=g.edge[i];
		if(v==f[u]||v==mson[u]) continue;
		dfs2(v,v);
	}
}
int qr(int x,int y){
	int ans=0;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		ans=(ans+tr.qry(id[top[x]],id[x],1,n,1))%p;
		//cout<<ans<<" "<<x<<"->"<<f[top[x]]<<"\n";
		x=f[top[x]]; 
	}
	if(dep[x]>dep[y]) swap(x,y);
	return (ans+tr.qry(id[x],id[y],1,n,1))%p; 
}
void ur(int x,int y,int v){
	int ans=0;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		tr.upd(id[top[x]],id[x],1,n,1,v%p);
		x=f[top[x]];
	}
	if(dep[x]>dep[y]) swap(x,y);
	tr.upd(id[x],id[y],1,n,1,v%p);
}
int qs(int u) {return tr.qry(id[u],id[u]+siz[u]-1,1,n,1)%p;}
void us(int u,int v) {tr.upd(id[u],id[u]+siz[u]-1,1,n,1,v%p);}
signed main(){
	cin>>n>>m>>r>>p;
	for(int i=1;i<=n;i++) cin>>wt[i];
	for(int i=1;i<n;i++){
		int u,v;
		cin>>u>>v;
		g.add(u,v);
		g.add(v,u);
	}
	dfs1(r,0);
	dfs2(r,r);
	tr.build(1,1,n);
	while(m--){
		int opt,x,y,v;
		cin>>opt>>x;
		if(opt<3) cin>>y;
		if(opt==1||opt==3) cin>>v;
		if(opt==1) ur(x,y,v);
		if(opt==2) cout<<qr(x,y)<<"\n";
		if(opt==3) us(x,v);
		if(opt==4) cout<<qs(x)<<"\n";
	}
	return 0;
}

P4783 【模板】矩阵求逆

#include<bits/stdc++.h>
#define int long long
#define x first
#define y second
using namespace std;
const int N=8e2+10,inf=0x3f3f3f3f,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
int qm(int a,int b){
	int res=1;
	while(b){
		if(b&1) res=(res*a)%mod;
		a=a*a%mod,b>>=1;
	} 
	return res;
}
const double eps=1e-7;
struct Mat{
	int n,m,ck=0,mx[N][N];
	void chk(int lx,int rx,int ly,int ry){
		for(int i=lx;i<=rx;i++){
			for(int j=ly;j<=ry;j++)
				cout<<(mx[i][j]+mod)%mod<<" ";
			cout<<"\n";
		}
		cout<<"\n";
	}
	void gk(int i,int k) {for(int x=1;x<=m;x++) mx[i][x]=mx[i][x]*qm(k,mod-2)%mod;} 
	void sw(int i,int j) {if(i==j) return;for(int x=1;x<=m;x++) swap(mx[i][x],mx[j][x]);}
	void ad(int i,int j,int k) {if(!i||!j||i==j) return;for(int x=1;x<=m;x++) mx[j][x]=((mx[j][x]+k*mx[i][x])%mod+mod)%mod;}
	void gs(){
		int l=1;
		for(int i=1;i<=n&&l<=n;i++){
			double f=0; int ans=0;
			for(int j=l;j<=n;j++) 
				if(fabs(mx[j][i])>fabs(f)) ans=j,f=mx[j][i];
			if(fabs(f)<eps) continue; sw(l,ans);gk(l,f);
			for(int j=1;j<=n;j++) ad(l,j,-mx[j][i]);++l;
		}
	}
}M;
int n;
signed main(){
	cin>>n; M.n=n,M.m=n*2;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			cin>>M.mx[i][j];
	for(int i=1;i<=n;i++)
		M.mx[i][i+n]=1;
	M.gs();
	if(fabs(M.mx[n][n])<eps) return cout<<"No Solution",0;
	M.chk(1,n,n+1,n*2);
	return 0;
}

P3377 【模板】左偏树/可并堆

#include<bits/stdc++.h>
#define int long long
#define x first
#define y second
using namespace std;
const int N=2e6+10,inf=0x3f3f3f3f,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*
 
*/
struct TSB{
	int lc,rc,d,val;
}tr[N];
int n,m,a[N],f[N],del[N];
int find(int x) {return x==f[x]?x:f[x]=find(f[x]);} 
int merge(int x,int y){
	if(!x||!y) return x+y;
	if(tr[x].val>tr[y].val) swap(x,y);
	tr[x].rc=merge(tr[x].rc,y);
	if(tr[tr[x].lc].d<tr[tr[x].rc].d) swap(tr[x].rc,tr[x].lc);
	tr[x].d=tr[tr[x].rc].d+1;
	return x;
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>tr[i].val,f[i]=i;
	while(m--){
		int opt,x,y;
		cin>>opt>>x;
		if(opt==1){
			cin>>y;
			if(del[x]||del[y]) continue; 
			x=find(x),y=find(y);
			if(x!=y) f[x]=f[y]=merge(x,y);
		}
		if(opt==2){
			if(del[x]) {cout<<"-1\n";continue;}
			x=find(x);
			cout<<tr[x].val<<"\n"; del[x]=1; 
			int l=tr[x].lc,r=tr[x].rc;
			f[l]=f[r]=f[x]=merge(l,r);
			tr[x]={0,0,0,0}; 
		}
	}
	return 0;
}

省选/NOI-

P3380 【模板】树套树

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e7+10,inf=2147483647;
int n,m,op,x,y,k,tot=2,rt[N],a[N];  //rt:每个区间的根
struct A{
	int cnt,sz,fa,vl,s[2];  //数量、size、father、val、son
}tr[N];
void psu(int x){tr[x].sz=tr[tr[x].s[0]].sz+tr[tr[x].s[1]].sz+tr[x].cnt;}
int nw(int k,int fa){  //新建
	++tot;
	tr[tot].vl=k,tr[tot].fa=fa,tr[tot].cnt=tr[tot].sz=1;
	return tot;
}
void rot(int x){  //转
	int y=tr[x].fa,z=tr[y].fa,k=(tr[y].s[0]==x);
	tr[z].s[tr[z].s[1]==y]=x,tr[x].fa=z;
	tr[y].s[!k]=tr[x].s[k],tr[tr[x].s[k]].fa=y;
	tr[x].s[k]=y,tr[y].fa=x;
	psu(y),psu(x);
}
void spl(int &rt,int x,int k){  //转(Splay)
	for(int y;(y=tr[x].fa)!=k;rot(x))
		if(tr[y].fa!=k) rot((tr[y].s[1]==x)^(tr[tr[y].fa].s[1]==y)?x:y);
	if(!k) rt=x;
}
void ins(int &rt,int k){
	int x=rt,fa=0;
	while(x){
		if(tr[x].vl==k) return ++tr[x].cnt,spl(rt,x,0),void();
		fa=x,x=tr[x].s[tr[x].vl<k];
	}
	tr[fa].s[tr[fa].vl<k]=x=nw(k,fa),spl(rt,x,0);
}
int pre(int x,int k){
	int ans=-inf,pos=1;
	while(x)
		if(k<=tr[x].vl) x=tr[x].s[0];
		else{
			if(ans<=tr[x].vl) ans=tr[x].vl,pos=x;
			x=tr[x].s[1];
		}
	return pos;
}
int nxt(int x,int k){
	int ans=inf,pos=2;
	while(x)
		if(k>=tr[x].vl) x=tr[x].s[1];
		else{
			if(ans>=tr[x].vl) ans=tr[x].vl,pos=x;
			x=tr[x].s[0];
		}
	return pos;
}
void del(int &rt,int x,int k){
	if(tr[x].vl==k){
		if(tr[x].cnt>1) --tr[x].cnt;
		else{
			int pv=pre(rt,k),nt=nxt(rt,k);
			spl(rt,pv,0),spl(rt,nt,pv);
			tr[nt].s[0]=0;
			psu(nt),psu(pv);
		}
	}
	else del(rt,tr[x].s[tr[x].vl<k],k);
	psu(x);
}
int pre(int x,int l,int r,int ql,int qr,int k){
	if(ql<=l&&r<=qr) return tr[pre(rt[x],k)].vl;
	int mid=(l+r)>>1,ans=-inf;
	if(ql<=mid) ans=max(ans,pre(x*2,l,mid,ql,qr,k));
	if(qr>mid) ans=max(ans,pre(x*2+1,mid+1,r,ql,qr,k));
	return ans;
}
int nxt(int x,int l,int r,int ql,int qr,int k){
	if(ql<=l&&r<=qr) return tr[nxt(rt[x],k)].vl;
	int mid=(l+r)>>1,ans=inf;
	if(ql<=mid) ans=min(ans,nxt(x*2,l,mid,ql,qr,k));
	if(qr>mid) ans=min(ans,nxt(x*2+1,mid+1,r,ql,qr,k));
	return ans;
}
int rnk(int x,int k){
	if(!x) return 0;
	if(k<=tr[x].vl) return rnk(tr[x].s[0],k);
	return tr[tr[x].s[0]].sz+tr[x].cnt+rnk(tr[x].s[1],k);
}
int rnk(int x,int l,int r,int ql,int qr,int k){
	if(ql<=l&&r<=qr) return rnk(rt[x],k)-1;
	int mid=(l+r)>>1,ans=0;
	if(ql<=mid) ans+=rnk(x*2,l,mid,ql,qr,k);
	if(qr>mid) ans+=rnk(x*2+1,mid+1,r,ql,qr,k);
	return ans;
}
void upt(int x,int l,int r,int pos,int k){
	if(l<=pos&&pos<=r) del(rt[x],rt[x],a[pos]),ins(rt[x],k);
	if(l==r) return;
	int mid=(l+r)>>1;
	if(pos<=mid) upt(x*2,l,mid,pos,k);
	else upt(x*2+1,mid+1,r,pos,k);
}
void bld(int x,int l,int r){
	ins(rt[x],-inf),rt[x]=tot,ins(rt[x],inf);
	for(int i=l;i<=r;++i) ins(rt[x],a[i]);
	if(l==r) return;
	int mid=(l+r)>>1;
	bld(x*2,l,mid),bld(x*2+1,mid+1,r);
}
int kth(int ql,int qr,int k){  //要二分
	int l=0,r=1e8;
	while(l<r){
		int mid=(l+r+1)>>1;
		if(rnk(1,1,n,ql,qr,mid)+1>k) r=mid-1;
		else l=mid;
	}
	return l;
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;++i) cin>>a[i];
	bld(1,1,n);
	tr[1].vl=-inf,tr[2].vl=inf;
	while(m--){
		cin>>op>>x>>y;
		if(op!=3) cin>>k;
		if(op==1) cout<<rnk(1,1,n,x,y,k)+1<<endl;
		else if(op==2) cout<<kth(x,y,k)<<endl;
		else if(op==3) upt(1,1,n,x,y),a[x]=y;
		else if(op==4) cout<<pre(1,1,n,x,y,k)<<endl;
		else cout<<nxt(1,1,n,x,y,k)<<endl;
	}
	return 0;
}

P3804 【模板】后缀自动机(SAM)

反转了,要开 longlong

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
const int N=2e6+10,inf=0x3f3f3f3f,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
struct SAM{
	int len,link;
	int nxt[27];
}suf[N];
int siz,last;
ll ans,cnt[N];
void add(char c){
	int cur=++siz; cnt[cur]=1;
	suf[cur].len=suf[last].len+1;
	int p=last; last=cur;
	while(~p&&!suf[p].nxt[c]) suf[p].nxt[c]=cur,p=suf[p].link;
	if(p==-1) return suf[cur].link=0,void();
	int q=suf[p].nxt[c];
	if(suf[q].len==suf[p].len+1) suf[cur].link=q;
	else{
		int clone=++siz;
		suf[clone]=suf[q];
		suf[clone].len=suf[p].len+1;
		while(~p&&suf[p].nxt[c]==q) suf[p].nxt[c]=clone,p=suf[p].link;
		suf[q].link=suf[cur].link=clone;
	}
}
int head[N],nxt[N],edge[N],idx;
void addE(int u,int v){
	edge[++idx]=v;
	nxt[idx]=head[u];
	head[u]=idx;
}
void dfs(int u){
	for(int i=head[u];i;i=nxt[i]){
		int v=edge[i];
		dfs(v);
		cnt[u]+=cnt[v];
	}
	if(cnt[u]!=1) ans=max(ans,cnt[u]*suf[u].len);
}
signed main(){
	string s;
	cin>>s;
	suf[0].link=-1;
	for(int i=0;i<s.size();i++) add(s[i]-'a');
	for(int i=1;i<=siz;i++) addE(suf[i].link,i);
	dfs(0);
	cout<<ans;
	return 0;
}

P3803 【模板】多项式乘法(FFT)

#include<bits/stdc++.h>
#define int long long
#define x first
#define y second
using namespace std;
const int N=5e6+10,inf=0x3f3f3f3f,mod=1e9+7;
const double pi=4*atan(-1.0);
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
int n,m,len=1,tot;
complex<double> a[N],b[N]; 
void fft(complex<double> *cmx,int len,int k){
	if(len==1) return;
	complex<double> e[len/2],o[len/2];
	for(int i=0;i<len;i+=2)
		e[i/2]=cmx[i],o[i/2]=cmx[i+1];
	fft(e,len/2,k),fft(o,len/2,k);
	complex<double> omegan(cos(2*pi/(len*1.0)),k*sin(2*pi/(len*1.0))),omegak(1,0);
	for(int i=0;i<len/2;i++,omegak*=omegan){
		cmx[i]=e[i]+o[i]*omegak;
		cmx[i+len/2]=e[i]-o[i]*omegak;
	}
}
signed main(){
	cin>>n>>m;
	for(int i=0;i<=n;i++) cin>>tot,a[i].real(tot);
	for(int i=0;i<=m;i++) cin>>tot,b[i].real(tot);
	while(len<n+m+1) len*=2;
	fft(a,len,1),fft(b,len,1);
	for(int i=0;i<len;i++) a[i]*=b[i];
	fft(a,len,-1);
	for(int i=0;i<=n+m;i++) printf("%.0f ",(a[i].real()+0.5)/len);
	return 0;
}

P1919 【模板】高精度乘法 | A*B Problem 升级版

简单 ntt

#include<bits/stdc++.h>
#define int long long
#define x first
#define y second
using namespace std;
const int N=5e6+10,inf=0x3f3f3f3f,p=998244353,g=3,gi=332748118;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
int n,m,len=1,tot,l,r[N];
int a[N],b[N]; 
int quickMi(int a,int b){
	int ans=1,bit=a;
	while(b>0){
		if(b&1) ans=(ans*bit)%p;
		bit=(bit*bit)%p;
		b>>=1;
	}
	return ans%p;
}
void ntt(int *cmx,int len,int k){
	for(int i=0;i<len;i++)
		if(i<r[i]) swap(cmx[i],cmx[r[i]]);
	for(int mid=1;mid<len;mid<<=1){
		int omegan=quickMi((k==1?g:gi),(p-1)/(mid<<1));
		for(int t=mid<<1,i=0;i<len;i+=t){
			int omegak=1;
			for(int k=0;k<mid;k++,omegak=(omegak*omegan)%p){
				int x=cmx[i+k],y=(omegak*cmx[i+k+mid])%p;
				cmx[i+k]=(x+y)%p;
				cmx[i+k+mid]=(x-y+p)%p;
			}
		}
	}
}
int ans[N];
string s1,s2;
signed main(){
	cin>>s1>>s2; n=s1.size()-1,m=s2.size()-1;
	for(int i=0;i<=n;i++) a[i]=(s1[n-i]-'0');
	for(int i=0;i<=m;i++) b[i]=(s2[m-i]-'0');
	while(len<n+m+1) len*=2,l++;
	for(int i=0;i<len;i++) r[i]=(r[i>>1ll]>>1ll)|((i&1ll)<<(l-1ll));
	ntt(a,len,1),ntt(b,len,1);
	for(int i=0;i<len;i++) a[i]*=b[i];
	ntt(a,len,-1);
	int inv=quickMi(len,p-2);;
	for(int i=0;i<=len;i++) ans[i]=(a[i]*inv)%p;
	for(int i=0;i<=len;i++) ans[i+1]+=ans[i]/10,ans[i]%=10;
	while(ans[len]==0&&len) len--;
	while(~len) cout<<ans[len--];
	return 0;
}

P4238 【模板】多项式乘法逆

#include<bits/stdc++.h>
#define int long long
#define x first
#define y second
using namespace std;
const int N=2e6+10,inf=0x3f3f3f3f,p=998244353,g=3,gi=332748118;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
int n,m,len=1,tot,l,r[N];
int a[N],b[N]; 
int quickMi(int a,int b){
	int ans=1,bit=a;
	while(b>0){
		if(b&1) ans=(ans*bit)%p;
		bit=(bit*bit)%p;
		b>>=1;
	}
	return ans%p;
}
void ntt(int *cmx,int len,int k){
	for(int i=0;i<len;i++)
		if(i<r[i]) swap(cmx[i],cmx[r[i]]);
	for(int mid=1;mid<len;mid<<=1){
		int omegan=quickMi((k==1?g:gi),(p-1)/(mid<<1));
		for(int t=mid<<1,i=0;i<len;i+=t){
			int omegak=1;
			for(int k=0;k<mid;k++,omegak=(omegak*omegan)%p){
				int x=cmx[i+k],y=(omegak*cmx[i+k+mid])%p;
				cmx[i+k]=(x+y)%p;
				cmx[i+k+mid]=(x-y+p)%p;
			}
		}
	}
}
int ans[N];
char s1[N],s2[N];
void work(int *f,int *g,int n){
	if(n==1){
		g[0]=quickMi(f[0],p-2);
		return;
	}
	work(f,g,((n+1)>>1));
	int len=1,l=0;
	while(len<(n<<1)) len<<=1,l++;
	for(int i=0;i<n;i++) ans[i]=f[i];
	for(int i=n;i<len;i++) ans[i]=0;
	for(int i=1;i<len;i++) r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
	ntt(ans,len,1),ntt(g,len,1);
	for(int i=0;i<len;i++) g[i]=(g[i]*((2ll-ans[i]*g[i])%p+p)%p)%p;
	ntt(g,len,-1);
	int inv=quickMi(len,p-2);
	for(int i=0;i<len;i++) g[i]=(g[i]*inv)%p;
	for(int i=n;i<len;i++) g[i]=0;
}
signed main(){
	cin>>n;
	for(int i=0;i<n;i++) cin>>a[i],a[i]=(a[i]+p)%p;
	work(a,b,n);
	for(int i=0;i<n;i++)
		cout<<b[i]<<" ";
	return 0;
}

P3402 可持久化并查集

#include<bits/stdc++.h>
using namespace std;
const int N=2e6+7;
struct node{
	int l,r,c,dep;
}f[N*20];
int tot,n,m,opt,k,u,v,rt[N];
int init(int l,int r){
	int mid=(l+r)>>1,pos=++tot;
	if(l==r){
		f[pos].c=l;
		return pos;
	}
	f[pos].l=init(l,mid),f[pos].r=init(mid+1,r);
	return pos;
}
int find_k(int l,int r,int k,int pos){    //f[k]
	if(l==r) return pos;
	int mid=(l+r)>>1;
	if(k>mid) return find_k(mid+1,r,k,f[pos].r);
	else return find_k(l,mid,k,f[pos].l);
}
int change(int l,int r,int k,int p,int x){   //f[k]=x
	int mid=(l+r)>>1,pos=++tot;f[pos]=f[p];
	if(l==r){
		f[pos].c=x;
		return pos;
	}
	if(k>mid) f[pos].r=change(mid+1,r,k,f[p].r,x);
	else f[pos].l=change(l,mid,k,f[p].l,x);
	return pos;
}
int newl(int l,int r,int p,int x){
	int mid=(l+r)>>1,pos=++tot; f[pos]=f[p];
	if(l==r){
		f[pos].dep++;
		return pos;
	}
	if(x>mid) f[pos].r=newl(mid+1,r,f[p].r,x);
	else f[pos].l=newl(l,mid,f[p].l,x);
	return pos;
}
int find(int x,int c){
	int fa=find_k(1,n,x,rt[c]);
	if(f[fa].c==x) return fa;
	return find(f[fa].c,c);
}
int main(){
	cin>>n>>m;
	rt[0]=init(1,n);
	for(int i=1;i<=m;i++){
		rt[i]=rt[i-1];
		scanf("%d%d",&opt,&u);
		if(opt==1){
			scanf("%d",&v);
			u=find(u,i-1),v=find(v,i-1);
			if(f[u].c==f[v].c) continue;
			//f[find(u)]=find(v)
			if(f[u].dep>f[v].dep) swap(u,v);
			rt[i]=change(1,n,f[u].c,rt[i],f[v].c);
			if(f[u].dep==f[v].dep) rt[i]=newl(1,n,rt[i],f[v].c);
		}
		else if(opt==2) rt[i]=rt[u];
		else{
			scanf("%d",&v);
			cout<<(find(u,i)==find(v,i))<<"\n";
		}
	}
	return 0;
}

P6178 【模板】Matrix-Tree 定理

#include<bits/stdc++.h>
#define int long long
#define x first
#define y second
using namespace std;
const int N=8e2+10,inf=0x3f3f3f3f,mod=1e9+7;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
int qm(int a,int b){
	int res=1;
	while(b){
		if(b&1) res=(res*a)%mod;
		a=a*a%mod,b>>=1;
	} 
	return res;
}
const double eps=1e-7;
struct Mat{
	int n,m,ck=0,mx[N][N];
	void chk(int lx,int rx,int ly,int ry){
		for(int i=lx;i<=rx;i++){
			for(int j=ly;j<=ry;j++)
				cout<<(mx[i][j]+mod)%mod<<" ";
			cout<<"\n";
		}
		cout<<"\n";
	}
	void gk(int i,int k) {for(int x=1;x<=m;x++) mx[i][x]=mx[i][x]*qm(k,mod-2)%mod;} 
	void sw(int i,int j) {if(i==j) return;for(int x=1;x<=m;x++) swap(mx[i][x],mx[j][x]);}
	void ad(int i,int j,int k) {if(!i||!j||i==j) return;for(int x=1;x<=m;x++) mx[j][x]=((mx[j][x]+k*mx[i][x])%mod+mod)%mod;}
	void gs(){
		int l=1;
		for(int i=1;i<=m&&l<=n;i++){
			int ans=0;
			for(int j=l;j<=n;j++) 
				if(mx[j][i]) {ans=j;break;}
			if(!ans) continue; sw(l,ans);
			for(int j=1;j<=n;j++) ad(l,j,-mx[j][i]*qm(mx[l][i],mod-2)%mod);++l;
		}
	}
	int det(){
		int res=1; gs();
		for(int i=1;i<=n;i++) res=res*mx[i][i]%mod;
		return res;
	} 
}M,T;
int n,m,t;
void add(int u,int v,int w){
	M.mx[v][v]=(M.mx[v][v]+w)%mod;
	M.mx[v][u]=(M.mx[v][u]-w)%mod;
}
signed main(){
	cin>>n>>m>>t; --n; 
	M.n=M.m=n;
	for(int i=1;i<=m;i++){
		int u,v,w;
		cin>>u>>v>>w;
		add(--u,--v,w);
		if(!t) add(v,u,w);
	}
	cout<<M.det();
	return 0;
}

P4725 【模板】多项式对数函数(多项式 ln)

#include<bits/stdc++.h>
#define int long long
#define x first
#define y second
using namespace std;
const int N=2e6+10,inf=0x3f3f3f3f,p=998244353,g=3,gi=332748118;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long long ll;
/*

*/
int n,m,len=1,tot,l,r[N];
int a[N],b[N],c[N]; 
int quickMi(int a,int b){
	int ans=1,bit=a;
	while(b>0){
		if(b&1) ans=(ans*bit)%p;
		bit=(bit*bit)%p;
		b>>=1;
	}
	return ans%p;
}
void ntt(int *cmx,int len,int k){
	for(int i=0;i<len;i++)
		if(i<r[i]) swap(cmx[i],cmx[r[i]]);
	for(int mid=1;mid<len;mid<<=1){
		int omegan=quickMi((k==1?g:gi),(p-1)/(mid<<1));
		for(int t=mid<<1,i=0;i<len;i+=t){
			int omegak=1;
			for(int k=0;k<mid;k++,omegak=(omegak*omegan)%p){
				int x=cmx[i+k],y=(omegak*cmx[i+k+mid])%p;
				cmx[i+k]=(x+y)%p;
				cmx[i+k+mid]=(x-y+p)%p;
			}
		}
	}
}
int ans[N];
char s1[N],s2[N];
void ginv(int *f,int *g,int n){
	if(n==1){
		g[0]=quickMi(f[0],p-2);
		return;
	}
	ginv(f,g,((n+1)>>1));
	int len=1,l=0;
	while(len<(n<<1)) len<<=1,l++;
	for(int i=0;i<n;i++) ans[i]=f[i];
	for(int i=n;i<len;i++) ans[i]=0;
	for(int i=1;i<len;i++) r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
	ntt(ans,len,1),ntt(g,len,1);
	for(int i=0;i<len;i++) g[i]=(g[i]*((2ll-ans[i]*g[i])%p+p)%p)%p;
	ntt(g,len,-1);
	int inv=quickMi(len,p-2);
	for(int i=0;i<len;i++) g[i]=(g[i]*inv)%p;
	for(int i=n;i<len;i++) g[i]=0;
}
void mul(int *a,int *b,int *c,int n,int m,int &len){
	while(len<n+m+1) len*=2,l++;
	for(int i=0;i<len;i++) r[i]=(r[i>>1ll]>>1ll)|((i&1ll)<<(l-1ll));
	ntt(a,len,1),ntt(b,len,1);
	for(int i=0;i<len;i++) a[i]=(a[i]*b[i])%p;
	ntt(a,len,-1);
	int inv=quickMi(len,p-2); len=n+m;
	for(int i=0;i<=len;i++) c[i]=(a[i]*inv)%p;
}
signed main(){
	cin>>n; n--;
	for(int i=0;i<=n;i++) cin>>a[i],a[i]=(a[i]+p)%p; ginv(a,b,n); 
	for(int i=0;i<=n;i++) a[i]=a[i+1]*(i+1)%p;
	mul(a,b,c,n-1,n,len); ++len;
	for(int i=n;i;i--) c[i]=c[i-1]*quickMi(i,p-2)%p; c[0]=0;
	for(int i=0;i<=n;i++) cout<<c[i]<<" ";
	return 0;
}
posted @ 2025-09-17 12:36  AnbyDemara  阅读(16)  评论(0)    收藏  举报