自用板子

线性逆元

点击查看代码
const int mod=1e9+7;
int jc[200005],iv[200005],ij[200005]; 
int C(int n,int m){
	if(n<0||m<0||n-m<0)return 0;
	return jc[n]*ij[m]%mod*ij[n-m]%mod;
}
jc[0]=1;for(int i=1;i<=n;i++)jc[i]=jc[i-1]*i%mod;
iv[1]=1;for(int i=2;i<=n;i++)iv[i]=mod-(mod/i)*iv[mod%i]%mod;
ij[0]=1;for(int i=1;i<=n;i++)ij[i]=ij[i-1]*iv[i]%mod;

segment tree

点击查看代码
struct segtree{
	#define ls p<<1
	#define rs p<<1|1
	#define lson l,mid,ls
	#define rson mid+1,r,rs
	struct Node{
		int s,mx,mn,tag;
	}c[800005];
	void pushup(int p){
		c[p].s=c[ls].s+c[rs].s;
		c[p].mx=max(c[ls].mx,c[rs].mx);  
		c[p].mn=min(c[ls].mn,c[rs].mn);  
	}
	void pushdown(int l,int r,int p){
		if(!c[p].tag)return;
		int siz=r-l+1,ln=siz-(siz>>1),rn=siz>>1;
		c[ls].s+=ln*c[p].tag,c[rs].s+=rn*c[p].tag;
		c[ls].mx+=c[p].tag,c[rs].mx+=c[p].tag;
		c[ls].mn+=c[p].tag,c[rs].mn+=c[p].tag;
		c[ls].tag+=c[p].tag,c[rs].tag+=c[p].tag;
		c[p].tag=0;  
	}
	void build(int l,int r,int p){
		if(l==r){c[p].s=c[p].mx=c[p].mn=a[l];return;}
		int mid=(l+r)>>1;
		build(lson),build(rson);
		pushup(p);
	}
	void update1(int l,int r,int p,int x,int k){
		if(l==r){c[p].s=c[p].mx=c[p].mn=k;return;}
		int mid=(l+r)>>1;pushdown(l,r,p);
		if(x<=mid)update1(lson,x,k);
		else update1(rson,x,k);
		pushup(p);
	}
	void update2(int l,int r,int p,int L,int R,int k){
		if(L<=l&&r<=R){c[p].s+=(r-l+1)*k,c[p].mx+=k,c[p].mn+=k,c[p].tag+=k;return;}
		int mid=(l+r)>>1;pushdown(l,r,p);
		if(L<=mid)update2(lson,L,R,k);
		if(R>mid)update2(rson,L,R,k);
		pushup(p);
	}
	int query1(int l,int r,int p,int L,int R){
		if(L<=l&&r<=R)return c[p].s;
		int mid=(l+r)>>1,res=0;pushdown(l,r,p);
		if(L<=mid)res+=query1(lson,L,R);
		if(R>mid)res+=query1(rson,L,R);
		return res;
	}
	int query2(int l,int r,int p,int L,int R){
		if(L<=l&&r<=R)return c[p].mx;
		int mid=(l+r)>>1,res=-inf;pushdown(l,r,p);
		if(L<=mid)res=max(res,query2(lson,L,R));
		if(R>mid)res=max(res,query2(rson,L,R));
		return res;
	}
	int query3(int l,int r,int p,int L,int R){
		if(L<=l&&r<=R)return c[p].mn;
		int mid=(l+r)>>1,res=inf;pushdown(l,r,p);
		if(L<=mid)res=min(res,query3(lson,L,R));
		if(R>mid)res=min(res,query3(rson,L,R));
		return res;
	}
	#undef ls
	#undef rs
	#undef lson
	#undef rson
}Tr;

lca

点击查看代码
struct edge{
	int v,nxt;
}e[300005];
int tot,head[300005];
void add(int u,int v){
	e[++tot]=(edge){v,head[u]},head[u]=tot;
}
int pa[500005][25],dep[500005];
void dfs(int u,int fa){
	dep[u]=dep[fa]+1,pa[u][0]=fa;
	for(int i=0;i<=22;i++)pa[u][i+1]=pa[pa[u][i]][i];
	for(int i=head[u];i;i=e[i].nxt){
		int v=e[i].v;if(v==fa)continue;
		dfs(v,u);
	}
}
int getlca(int x,int y){
	if(dep[x]>dep[y])swap(x,y);
	for(int i=22;i>=0&&dep[x]!=dep[y];i--)if(dep[y]-dep[x]>=(1<<i))y=pa[y][i];
	if(x==y)return x;
	for(int i=22;i>=0;i--)if(pa[x][i]!=pa[y][i])x=pa[x][i],y=pa[y][i];
	return pa[x][0];
}

dijkstra

点击查看代码
#include<bits/stdc++.h>
#define int long long
#define mk make_pair
#define fi first
#define se second
using namespace std;
typedef pair<int,int>pii;
const int inf=1e18;
struct edge{
	int v,w,nxt;
}e[200005];
int tot,head[200005];
void add(int u,int v,int w){
	e[++tot]=(edge){v,w,head[u]},head[u]=tot;
}
int d[200005],vis[200005];
void dijkstra(int s){
	for(int i=1;i<=n;i++)d[i]=inf,vis[i]=0;
	priority_queue<pii,vector<pii>,greater<pii> >q;
	d[s]=0;q.push(mk(d[s],s));
	while(!q.empty()){
		int u=q.top().se;q.pop();
		if(vis[u])continue;
		vis[u]=1;
		for(int i=head[u];i;i=e[i].nxt){
			int v=e[i].v,w=e[i].w;
			if(d[v]>d[u]+w)d[v]=d[u]+w,q.push(mk(d[v],v));
		}
	}
}

BIT

点击查看代码
struct BIT{
	int c[200005];
	void add(int x,int y){
		for(;x<=n;x+=x&-x)c[x]+=y;
	}
	int ask(int x){
		int res=0;
		for(;x;x-=x&-x)res+=c[x];
		return res;
	}
}Tr;
struct BIT{
	int c1[100005],c2[100005];
	void add(int x,int v){
		int y=x;
		for(;x<=n;x+=x&-x)c1[x]+=v,c2[x]-=y*v;
	}
	void add(int l,int r,int v){
		add(l,v),add(r+1,-v);
	}
	int ask(int x){
		int res=0,y=x;
		for(;x;x-=x&-x)res+=(y+1)*c1[x]+c2[x];
		return res;
	}
	int ask(int l,int r){
		return ask(r)-ask(l-1);
	}	
}Tr;
struct BIT{
	int c[4][2050][2050];
	void add(int x,int y,int k){
		for(int i=x;i<=n;i+=i&-i)for(int j=y;j<=m;j+=j&-j){
			c[0][i][j]+=k,c[1][i][j]+=x*k,c[2][i][j]+=y*k,c[3][i][j]+=x*y*k;
		}
	}
	void add(int x1,int y1,int x2,int y2,int v){
		add(x1,y1,v),add(x2+1,y1,-v),add(x1,y2+1,-v),add(x2+1,y2+1,v);
	}
	int ask(int x,int y){
		int res=0;
		for(int i=x;i;i-=i&-i)for(int j=y;j;j-=j&-j){
			res+=(x+1)*(y+1)*c[0][i][j]-(y+1)*c[1][i][j]-(x+1)*c[2][i][j]+c[3][i][j];
		}
		return res;
	}
	int ask(int x1,int y1,int x2,int y2){
		return ask(x2,y2)-ask(x2,y1-1)-ask(x1-1,y2)+ask(x1-1,y1-1);
	}
}Tr;

树剖

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
	int x=0,f=1;char ch=getchar();
	while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
	while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
struct edge{
	int v,nxt;
}e[400005];
int head[200005],tot;
void add(int u,int v){
	e[++tot]=(edge){v,head[u]},head[u]=tot;
}
int siz[200005],son[200005],pa[200005],dep[200005];
void dfs1(int u,int fa){
	siz[u]=1,son[u]=0,pa[u]=fa,dep[u]=dep[fa]+1;
	for(int i=head[u];i;i=e[i].nxt){
		int v=e[i].v;if(v==fa)continue;
		dfs1(v,u);siz[u]+=siz[v];
		if(siz[son[u]]<siz[v])son[u]=v;
	}
}
int cur,dfn[200005],rnk[200005],top[200005];
void dfs2(int u,int rt){
	top[u]=rt,dfn[u]=++cur,rnk[cur]=u;
	if(son[u])dfs2(son[u],rt);
	for(int i=head[u];i;i=e[i].nxt){
		int v=e[i].v;if(v==pa[u])continue;
		if(v!=son[u])dfs2(v,v);
	}
}
int n,m,root,P,a[200005];
struct segtree{
	#define ls p<<1
	#define rs p<<1|1
	#define lson l,mid,ls
	#define rson mid+1,r,rs
	struct Node{
		int s,tag;
	}c[800005];
	void pushup(int p){
		c[p].s=(c[ls].s+c[rs].s)%P;
	}
	void pushdown(int l,int r,int p){
		if(c[p].tag==0)return;
		int siz=r-l+1,ln=siz-(siz>>1),rn=siz>>1;
		c[ls].s=(c[ls].s+ln*c[p].tag)%P,c[rs].s=(c[rs].s+rn*c[p].tag)%P;
		c[ls].tag=(c[ls].tag+c[p].tag)%P,c[rs].tag=(c[rs].tag+c[p].tag)%P;
		c[p].tag=0;
	}
	void build(int l,int r,int p){
		if(l==r){
			c[p]=(Node){a[rnk[l]],0};
			return;
		}
		int mid=(l+r)>>1;
		build(lson),build(rson);
		pushup(p);
	}
	void update(int l,int r,int p,int L,int R,int k){
		if(L<=l&&r<=R){
			c[p].s=(c[p].s+(r-l+1)*k%P)%P;
			c[p].tag=(c[p].tag+k)%P;
			return;
		}
		int mid=(l+r)>>1;pushdown(l,r,p);
		if(L<=mid)update(lson,L,R,k);
		if(R>mid)update(rson,L,R,k);
		pushup(p);
	} 
	int query(int l,int r,int p,int L,int R){
		if(L<=l&&r<=R)return c[p].s;
		int mid=(l+r)>>1,res=0;pushdown(l,r,p);
		if(L<=mid)res=(res+query(lson,L,R))%P;
		if(R>mid)res=(res+query(rson,L,R))%P;
		return res;
	}
	void addPath(int u,int v,int k){
		while(top[u]!=top[v]){
			if(dep[top[u]]<dep[top[v]])swap(u,v);
			update(1,n,1,dfn[top[u]],dfn[u],k);
			u=pa[top[u]];
		}
		if(dep[u]<dep[v])swap(u,v);
		update(1,n,1,dfn[v],dfn[u],k);
	}
	int askPath(int u,int v){
		int res=0;
		while(top[u]!=top[v]){
			if(dep[top[u]]<dep[top[v]])swap(u,v);
			res=(res+query(1,n,1,dfn[top[u]],dfn[u]))%P;
			u=pa[top[u]];
		}
		if(dep[u]<dep[v])swap(u,v);
		res=(res+query(1,n,1,dfn[v],dfn[u]))%P;
		return res;
	}
	void addTree(int u,int k){
		update(1,n,1,dfn[u],dfn[u]+siz[u]-1,k);
	}
	int askTree(int u){
		return query(1,n,1,dfn[u],dfn[u]+siz[u]-1);
	}
	#undef ls
	#undef rs
	#undef lson
	#undef rson
}Tr;
signed main(){
	n=read(),m=read(),root=read(),P=read();
	for(int i=1;i<=n;i++)a[i]=read()%P;
	for(int i=1,u,v;i<n;i++)u=read(),v=read(),add(u,v),add(v,u);
	dfs1(root,0);dfs2(root,root);Tr.build(1,n,1);
	while(m--){
		int op=read(),x,y,z;
		if(op==1){
			x=read(),y=read(),z=read()%P;
			Tr.addPath(x,y,z);
		}
		if(op==2){
			x=read(),y=read();
			printf("%lld\n",Tr.askPath(x,y));
		}
		if(op==3){
			x=read(),z=read()%P;
			Tr.addTree(x,z);
		}
		if(op==4){
			x=read();
			printf("%lld\n",Tr.askTree(x));
		}
	}
	return 0;
}

欧拉函数

点击查看代码
int euler(int n){
	int res=n;
	for(int i=2;i*i<=n;i++){
		if(n%i==0){
			res=res/i*(i-1);
			while(n%i==0)n/=i;
		}		
	}
	if(n>1)res=res/n*(n-1);
	return res;
}
phi[1]=1;
for(int i=2;i<=n;i++){
	if(!np[i])p[++tot]=i,phi[i]=i-1;
	for(int j=1;j<=tot&&i*p[j]<=n;j++){
		np[i*p[j]]=1;
		if(i%p[j]==0){phi[i*p[j]]=phi[i]*p[j];break;} 
		else phi[i*p[j]]=phi[i]*phi[p[j]];
	}
}

平衡树(线段树实现)

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int SIZ=1e7;
inline int read(){
	int x=0,f=1;char ch=getchar();
	while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
	while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
struct segtree{
	#define ls c[p].lc
	#define rs c[p].rc
	#define lson l,mid,ls
	#define rson mid+1,r,rs
	struct Node{
		int lc,rc,c;
	}c[400005];
	int T=1;
	void pushup(int p){
		c[p].c=c[ls].c+c[rs].c;
	}
	int update(int l,int r,int p,int x,int k){
		if(!p)p=++T;
		if(l==r){c[p].c+=k;return p;}
		int mid=(l+r)>>1;
		if(x<=mid)ls=update(lson,x,k);
		else rs=update(rson,x,k);
		pushup(p);return p;
	}
	int query(int l,int r,int p,int L,int R){
		if(!p)return 0;
		if(L<=l&&r<=R)return c[p].c;
		int mid=(l+r)>>1,res=0;
		if(L<=mid)res+=query(lson,L,R);
		if(R>mid)res+=query(rson,L,R);
		return res;
	}
	int find(int l,int r,int p,int k){
		if(!p)return 0;
		if(l==r)return l;
		int mid=(l+r)>>1;
		if(k<=c[ls].c)return find(lson,k);
		else return find(rson,k-c[ls].c);
	}
	void insert(int x){
		update(-SIZ,SIZ,1,x,1);
	}
	void erase(int x){
		update(-SIZ,SIZ,1,x,-1);
	}
	int rank(int x){
		return query(-SIZ,SIZ,1,-SIZ,x-1)+1;
	} 
	int val(int x){
		return find(-SIZ,SIZ,1,x);
	}
	int pre(int x){
		return find(-SIZ,SIZ,1,query(-SIZ,SIZ,1,-SIZ,x-1));
	}
	int suf(int x){
		return find(-SIZ,SIZ,1,query(-SIZ,SIZ,1,-SIZ,x)+1);
	}
	#undef ls
	#undef rs
	#undef lson
	#undef rson
}Tr;
signed main(){
	int n=read();
	while(n--){
		int op=read(),x=read();
		if(op==1)Tr.insert(x);
		if(op==2)Tr.erase(x);
		if(op==3)printf("%lld\n",Tr.rank(x));
		if(op==4)printf("%lld\n",Tr.val(x));
		if(op==5)printf("%lld\n",Tr.pre(x));
		if(op==6)printf("%lld\n",Tr.suf(x));
	}
	return 0;
}

CRT/exCRT

点击查看代码
//CRT
int n=read(),m=1,ans=0;
for(int i=1;i<=n;i++){
	a[i]=read(),b[i]=read(),m*=a[i];
}
for(int i=1,x,y;i<=n;i++){
	exgcd(m/a[i],a[i],x,y);x=(x%a[i]+a[i])%a[i];
	ans=(ans+(m/a[i])%m*b[i]%m*x%m)%m;
}
//exCRT
int mul(int a,int b,int m){
	int res=0;
	while(b){
		if(b&1)res=(res+a)%m;
		a=(a+a)%m,b>>=1;
	}
	return res;
}
int gcd(int a,int b){
	return (b==0)?a:gcd(b,a%b);
}
int lcm(int a,int b){
	return a/gcd(a,b)*b;
}
int exgcd(int a,int b,int &x,int &y){
	if(b==0){x=1,y=0;return a;} 
	int g=exgcd(b,a%b,x,y),z=x;x=y;y=z-a/b*y;return g;
}
int n,a[100005],b[100005];
signed main(){
	n=read();
	for(int i=1;i<=n;i++){
		a[i]=read(),b[i]=read();
	}
	int m=a[1],ans=b[1],fl=1;
	for(int i=2,x,y,g,c;i<=n;i++){
		g=exgcd(m,a[i],x,y),x=(x%a[i]+a[i])%a[i];
		if((((b[i]-ans)%a[i]+a[i])%a[i])%g){fl=0;break;}
		c=((b[i]-ans)%a[i]+a[i])%a[i]/g;
		x=mul(x,c,a[i]),ans=(ans+mul(m,x,lcm(m,a[i]))),m=lcm(m,a[i]),ans=(ans%m+m)%m;
	}
	printf("%lld\n",fl?ans%m:-1);
}

Lucas/exLucas

点击查看代码
//Lucas
int qpow(int b,int p,int mod){
	int res=1;b%=mod;
	while(p){
		if(p&1)res=res*b%mod;
		p>>=1,b=b*b%mod;
	}
	return res;
}
int jc[100005];
int C(int n,int m,int p){
	if(n<0||m<0||n-m<0)return 0;
	return jc[n]*qpow(jc[m],p-2,p)%p*qpow(jc[n-m],p-2,p)%p;
}
int Lucas(int n,int m,int p){
	if(n==0)return 1;
	return Lucas(n/p,m/p,p)*C(n%p,m%p,p)%p;
}
//exLucas

BSGS/exBSGS

点击查看代码
//BSGS
int qpow(int b,int p,int mod){
	int res=1;
	while(p){
		if(p&1)res=res*b%mod;
		b=b*b%mod;p>>=1;
	}
	return res;
}	
map<int,int>h;
int BSGS(int p,int b,int n){
	int t=sqrt(p)+1;n%=p;for(int i=0;i<t;i++)h[n*qpow(b,i,p)%p]=i;
	b=qpow(b,t,p);if(!b)return (n==0)?1:-1;
	for(int i=1,val,j;i<=t;i++){
		val=qpow(b,i,p),j=(h.find(val)==h.end())?-1:h[val];
		if(j>=0&&i*t-j>=0)return i*t-j;
	}
	return -1;
}
signed main(){
	int p=read(),b=read(),n=read(),ans=BSGS(p,b,n);
	if(ans==-1)puts("no solution");
	else printf("%lld",ans);
	return 0;
}
//exBSGS

压位高精

点击查看代码
struct Bignum{
	static const long long N=75;
	static const long long base=1e17;
	static const long long ws=17;
	long long s[N];
	Bignum(){memset(s,0,sizeof s);s[0]=1;}
	void print(){
		printf("%lld",s[s[0]]);
		for(long long i=s[0]-1;i;--i)printf("%0*lld",(int)ws,s[i]);
		puts("");
	}
	Bignum & fix(){
		for(long long i=1;i<=s[0];++i){
			if(s[i]<0)s[i+1]--,s[i]+=base;
			s[i+1]+=s[i]/base,s[i]%=base;
			if(s[i+1])s[0]=max(s[0],i+1ll);
		}
		while(s[0]>1&&s[s[0]]==0)s[0]--;
		return *this;
	}
	Bignum & operator = (string &b){
		long long len=b.length();
		long long x=0,t=1,p=0;
		for(long long i=len-1;i>=0;--i){
			x=t*(b[i]-'0')+x,t*=10,p++;
			if(p==ws)s[s[0]++]=x,x=0,p=0,t=1;
		}
		if(x)s[s[0]]=x;
		return fix();
	}
	bool operator < (const Bignum b) const{
		if(s[0]!=b.s[0])return s[0]<b.s[0];
		for(long long i=s[0];i>=1;--i)if(s[i]!=b.s[i])return s[i]<b.s[i];
		return false;
	}
	bool operator <= (const Bignum b) const{
		if(s[0]!=b.s[0])return s[0]<b.s[0];
		for(long long i=s[0];i>=1;--i)if(s[i]!=b.s[i])return s[i]<b.s[i];
		return true;
	}
	bool operator > (const Bignum b) const{return b<*this;}
	bool operator >= (const Bignum b) const{return b<=*this;}
	bool operator == (const Bignum b) const{return !(*this<b)&&!(*this>b);}
	bool operator != (const Bignum b) const{return !(*this==b);}
	Bignum operator + (const Bignum b) const{
		Bignum c;c.s[0]=max(s[0],b.s[0]);
		for(long long i=1;i<=c.s[0];++i)c.s[i]=s[i]+b.s[i];
		return c.fix();
	}
	Bignum operator + (const long long & b) const{
		Bignum c=*this;c.s[1]+=b;
		return c.fix();
	}
	Bignum operator - (const Bignum b) const{
		Bignum c;c.s[0]=max(s[0],b.s[0]);
		for(long long i=1;i<=c.s[0];++i)c.s[i]=s[i]-b.s[i];
		return c.fix();
	}
	Bignum operator * (const Bignum b) const{
		Bignum c;c.s[0]=s[0]+b.s[0]-1;
		for(long long i=1;i<=s[0];++i)for(long long j=1;j<=b.s[0];j++)c.s[i+j-1] += s[i]*b.s[j];
		return c.fix();
	}
	Bignum operator * (const long long & b) const{
		Bignum c=*this;
		for(long long i=1;i<=s[0];++i)c.s[i]*=b;
		return c.fix();
	}
	Bignum operator / (const Bignum b) const{
		Bignum c,rest;
		for(long long i=s[0];i>=1;--i){
			rest=rest*(long long)base+s[i];
			long long l=0,r=base,ans=0;
			while(l<=r){
				long long mid=(l+r)/2;
				if(rest>=b*mid)ans=mid,l=mid+1;
				else r=mid-1;
			}
			c.s[i]+=ans,rest=rest-b*ans;
		}
		return c.fix();
	}
	Bignum operator % (const Bignum b) const{
		Bignum rest=*this-(*this)/b*b;
		return rest.fix();
	}
};

差分约束

点击查看代码
int n,m,vis[5005],dis[5005],in[5005];
int spfa(int x){
	for(int i=1;i<=n;i++)dis[i]=inf,vis[i]=in[i]=0;
	dis[x]=0,vis[x]=1;queue<int>q;q.push(x);
	while(!q.empty()){
		int u=q.front();q.pop();vis[u]=0;
		for(int i=head[u];i;i=e[i].nxt){
			int v=e[i].v,w=e[i].w;
			if(dis[v]>dis[u]+w){
				dis[v]=dis[u]+w,in[v]=in[u]+1;
				if(in[v]>n)return 1;
				if(!vis[v])q.push(v),vis[v]=1;
			}
		}
	}	
	return 0;
}
signed main(){
	n=read(),m=read();
	for(int i=1,u,v,w;i<=m;i++)u=read(),v=read(),w=read(),add(v,u,w);
	for(int i=1;i<=n;i++)add(0,i,0);
	if(spfa(0))return puts("NO"),0;
	for(int i=1;i<=n;i++)printf("%lld ",dis[i]);
	return 0;
}

modint

点击查看代码
template<const int T>
struct ModInt{
	const static int mod=T;
	int x;
	ModInt(int x=0):x(x%mod){}
	int val(){return x;}
	ModInt operator +(const ModInt &a)const{int x0=x+a.x;return ModInt(x0<mod?x0:x0-mod);}
	ModInt operator -(const ModInt &a)const{int x0=x-a.x;return ModInt(x0<0?x0+mod:x0);}
	ModInt operator *(const ModInt &a)const{return ModInt(x*a.x%mod);}
	ModInt operator /(const ModInt &a)const{return *this*a.inv();}
	void operator +=(const ModInt &a){x+=a.x;if(x>=mod)x-=mod;}
	void operator -=(const ModInt &a){x-=a.x;if(x<0)x+=mod;}
	void operator *=(const ModInt &a){x=x*a.x%mod;}
	void operator /=(const ModInt &a){*this=*this/a;}
	friend ModInt operator +(int y,const ModInt &a){int x0=y+a.x;return ModInt(x0<mod?x0:x0-mod);}
	friend ModInt operator -(int y,const ModInt &a){int x0=y-a.x;return ModInt(x0<0?x0+mod:x0);}
	friend ModInt operator *(int y,const ModInt &a){return ModInt(y*a.x%mod);}
	friend ModInt operator /(int y,const ModInt &a){return ModInt(y)/a;}
	friend ostream &operator<<(ostream &os,const ModInt &a){return os<<a.x;}
	friend istream &operator>>(istream &is,ModInt &t){return is>>t.x;}
	ModInt pow(int p)const{
		ModInt res=1,b=x;
		for(;p;p>>=1,b*=b)if(p&1)res*=b;
		return res;
	}
	ModInt inv()const{
		int a=x,b=mod,u=1,v=0;
		while(b){
			int t=a/b;
			a-=t*b;swap(a,b);
			u-=t*v;swap(u,v);
		}
		if(u<0)u+=mod;
		return u;
	}
};
typedef ModInt<mod>mint;

伪万能头

点击查看代码
#include<algorithm>
#include<bitset>
#include<cctype>
#include<cerrno>
#include<clocale>
#include<cmath>
#include<complex>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<deque>
#include<exception>
#include<fstream>
#include<functional>
#include<limits>
#include<list>
#include<map>
#include<iomanip>
#include<ios>
#include<iosfwd>
#include<iostream>
#include<istream>
#include<ostream>
#include<queue>
#include<set>
#include<sstream>
#include<stack>
#include<stdexcept>
#include<streambuf>
#include<string>
#include<utility>
#include<vector>
#include<cwchar>
#include<cwctype>
posted @ 2023-02-06 21:01  xx019  阅读(38)  评论(0编辑  收藏  举报