板子
板子
博主线上考试自己用的板子。
快读
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 ;
}