板子

板子

博主线上考试自己用的板子。

快读

char buf[1<<21],*p1=buf,*p2=buf,obuf[1<<21],*O=obuf;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)

计数

取模

inline int add(int x){return (x>=mod)?x-mod:x;}
inline void add(int &x,int y){x=add(x+y);return ;}
inline int sub(int x){return (x<0)?x+mod:x;}
inline void sub(int &x,int y){x=sub(x-y);return ;}
inline int power(int x,int b){
	int res=1;
	while(b){
		if(b&1)res=1ll*res*x%mod;
		x=1ll*x*x%mod;
		b>>=1;
	}
	return res;
}

阶乘预处理与组合数

int fc[maxn],ifc[maxn];
inline int binom(int n,int m){
	if(n>m||m<0)return 0;
	return 1ll*fc[n]*ifc[m]%mod*ifc[n-m]%mod;
}
void init(int n){
	fc[0]=1;for(int i=1;i<=n;i++)fc[i]=1ll*fc[i-1]*i%mod;
	ifc[n]=power(fc[n],mod-2);for(int i=n-1;i>=0;i--)ifc[i]=1ll*ifc[i+1]*(i+1)%mod;
	return ;
}

数论

Pollard_Rho

namespace PR{
	inline ll gcd(ll a,ll b){return b==0?a:gcd(b,a%b);}
	inline ll power(ll x,ll p,ll mod){
		ll ans=1;
		while(p){
			if(p&1)ans=(lll)ans*x%mod;
			x=(lll)x*x%mod;
			p>>=1;
		}
		return ans;
	}
	inline bool mr(ll x,ll b){
		ll k=x-1;
		while(k){
			ll cur=power(b,k,x);
			if(cur!=1&&cur!=x-1)return false;
			if((k&1)==1||cur==x-1)return true;
			k>>=1;
		}
		return true;
	}
	const int coef[]={2,325,9375,28178,450775,9780504,1795265022};
	inline bool isprime(ll x){
		if(x==2||x==3||x==5||x==13||x==19||x==73||x==193||x==407521||x==299210837)return true;
		for(int i=0;i<7;i++)if(!mr(x,coef[i]))return 0;
		return 1;
	}
	inline ll f(ll x,ll c,ll n){return ((lll)x*x+c)%n;}
	mt19937 rnd(time(0));
	inline ll Pollard_Rho(ll x){
		ll s=0,t=0,c=1ll*rnd()%(x-1)+1;
		ll val=1;
		for(int lim=1;;lim<<=1){
			s=t,val=1;
			for(int st=1;st<=lim;st++){
				t=f(t,c,x);
				val=(lll)val*abs(t-s)%x;
				if((st%127)==0){
					ll d=gcd(val,x);
					if(d>1)return d;
				}
			}
			ll d=gcd(val,x);
			if(d>1)return d;
		}
	}
	vec<ll> pr;
	inline void fac(ll x){
		if(x<2)return ;
		if(isprime(x)){pr.eb(x);return ;}
		ll p=x;
		while(p>=x)p=Pollard_Rho(x);
		fac(x/p),fac(p);
		return ;
	}
};

字符串

SAM

int tot=1,lst=1;
int to[2*maxn][26],len[2*maxn],nxt[2*maxn];
int siz[2*maxn];
void extend(int c){
    int p=lst,u=++tot;
    len[u]=len[p]+1;siz[u]=1;
    while(p&&!to[p][c])to[p][c]=u,p=nxt[p];
    if(!p)nxt[u]=1;
    else{
        int d=to[p][c];
        if(len[d]==len[p]+1)nxt[u]=d;
        else{
            int v=++tot;
            len[v]=len[p]+1;
            for(int i=0;i<26;i++)to[v][i]=to[d][i];
            nxt[v]=nxt[d];nxt[d]=nxt[u]=v;
            while(p&&to[p][c]==d)to[p][c]=v,p=nxt[p];
        }
    }
    lst=u;
    return ;
}
posted @ 2023-06-19 18:33  juju527  阅读(154)  评论(0编辑  收藏  举报