zoukankan      html  css  js  c++  java
  • 板子

    不定期更。

    数论

     1 const int pri[12]={2,3,5,7,11,13,17,19,23,29,31,37};
     2 ll ksc(ll x,ll y,ll mod){
     3     ll tmp=x*y-(ll)((ld)x/mod*y+0.5)*mod;
     4     return tmp<0?tmp+mod:tmp;
     5 }
     6 ll ksm(ll x,ll p,ll mod){
     7     ll ret=1;
     8     for (;p;p>>=1,x=ksc(x,x,mod)) if (p&1) ret=ksc(ret,x,mod);
     9     return ret;
    10 }
    11 bool MR(ll n){
    12     if (n<=1) return 0;
    13     rep (i,0,11) if (n==pri[i]) return 1;
    14     ll d=n-1; int tmp=0;
    15     while (!(d&1)) d>>=1,tmp++;
    16     rep (i,0,11){
    17         ll x=ksm(pri[i],d,n),p=x;
    18         rep (t,1,tmp){
    19             x=ksc(x,x,n);
    20             if (x==1 && p!=1 && p!=n-1) return 0;
    21             p=x;
    22         }
    23         if (x!=1) return 0;
    24     }
    25     return 1;
    26 }
    Miller Rabin
     1 vector<ll> V;
     2 namespace Rho{
     3     const int pri[12]={2,3,5,7,11,13,17,19,23,29,31,37};
     4     ull Rd;
     5     ll Rand(ll mod){return (Rd+=4179340454199820289ll)%mod;}
     6     ll ksc(ll x,ll y,ll mod){
     7         ll tmp=x*y-(ll)((ld)x/mod*y+0.5)*mod;
     8         return tmp<0?tmp+mod:tmp;
     9     }
    10     ll ksm(ll x,ll p,ll mod){
    11         ll ret=1;
    12         for (;p;p>>=1,x=ksc(x,x,mod)) if (p&1) ret=ksc(ret,x,mod);
    13         return ret;
    14     }
    15     bool MR(ll n){
    16         if (n<=1) return 0;
    17         rep (i,0,11) if (n==pri[i]) return 1;
    18         ll d=n-1; int tmp=0;
    19         while (!(d&1)) d>>=1,tmp++;
    20         rep (i,0,11){
    21             ll x=ksm(pri[i],d,n),p=x;
    22             rep (t,1,tmp){
    23                 x=ksc(x,x,n);
    24                 if (x==1 && p!=1 && p!=n-1) return 0;
    25                 p=x;
    26             }
    27             if (x!=1) return 0;
    28         }
    29         return 1;
    30     }
    31     ll f(ll x,ll c,ll mod){return (ksc(x,x,mod)+c)%mod;}
    32     ll gcd(ll a,ll b){return !b?a:gcd(b,a%b);}
    33     ll get(ll c,ll n){
    34         ll x=Rand(n),y=f(x,c,n),p=n;
    35         while (x!=y&&(p==n||p==1)){
    36             p=gcd(n,x>y?x-y:y-x);
    37             x=f(x,c,n); y=f(f(y,c,n),c,n);
    38         }
    39         return p;
    40     }
    41     void work(ll n){
    42         if (n<=1) return;
    43         if (MR(n)){V.push_back(n); return;}
    44         while (1){
    45             ll tmp=get(Rand(n-1)+1,n);
    46             if (tmp!=n&&tmp!=1){work(tmp); work(n/tmp); return;}
    47         }
    48     }
    49 }
    Pollard Rho

    字符串

     1 int n,all,rk[N],tp[N],t[N],sa[N],h[N],lg[N],mi[N][23]; char s[N];
     2 void js_sort(){
     3     rep (i,1,all) t[i]=0;
     4     rep (i,1,n) t[rk[tp[i]]]++;
     5     rep (i,1,all) t[i]+=t[i-1];
     6     for (int i=n;i;i--) sa[t[rk[tp[i]]]--]=tp[i];
     7 }
     8 void get_sa(){
     9     rep (i,1,n) rk[i]=s[i],tp[i]=i;
    10     all=127; js_sort(); int w=1; all=1;
    11     while (all<n){
    12         int k=0;
    13         rep (i,n-w+1,n) tp[++k]=i;
    14         rep (i,1,n) if (sa[i]>w) tp[++k]=sa[i]-w;
    15         js_sort();
    16         rep (i,1,n) tp[i]=rk[i];
    17         rk[sa[all=1]]=1;
    18         rep (i,2,n) rk[sa[i]]=(tp[sa[i]]==tp[sa[i-1]]&&tp[sa[i]+w]==tp[sa[i-1]+w])?all:++all;
    19         w<<=1;
    20     }
    21     int k=0;
    22     rep (i,1,n){
    23         if (k) k--; int j=sa[rk[i]-1];
    24         for (;i+k<=n&&j+k<=n&&s[i+k]==s[j+k];k++);
    25         h[rk[i]]=k;
    26     }
    27 }
    28 void st_init(){
    29     rep (i,1,n-1) mi[i][0]=h[i+1],lg[i]=i==1?0:lg[i>>1]+1;
    30     rep (j,1,18)
    31         for (int i=2;i+(1<<j-1)<n;i++)
    32             mi[i][j]=min(mi[i][j-1],mi[i+(1<<j-1)][j-1]);
    33 }
    34 int lcp(int x,int y){
    35     if (x==y) return n-x+1;
    36     x=rk[x],y=rk[y];
    37     if (x>y) swap(x,y); y--;
    38     int t=lg[y-x+1];
    39     return min(mi[x][t],mi[y-(1<<t)+1][t]);
    40 }
    SA
     1 //n=strlen(s+1)
     2 int n,k,las,tot,ch[N][26],fa[N],len[N],sz[N],t[N],q[N]; char s[N];
     3 void init(){
     4     las=tot=1;
     5 }
     6 void extend(int c){
     7     int p=las,np=las=++tot,q,nq; len[np]=len[p]+1; sz[np]=1;
     8     for (;p&&!ch[p][c];p=fa[p]) ch[p][c]=np;
     9     if (!p){fa[np]=1; return;}
    10     q=ch[p][c];
    11     if (len[q]==len[p]+1) fa[np]=q;
    12     else{
    13         nq=++tot; len[nq]=len[p]+1;
    14         memcpy(ch[nq],ch[q],sizeof(ch[q]));
    15         fa[nq]=fa[q]; fa[q]=fa[np]=nq;
    16         for (;p&&ch[p][c]==q;p=fa[p]) ch[p][c]=nq;
    17     }
    18 }
    19 void js_sort(){//基数排序
    20     rep (i,1,n) t[i]=0;
    21     rep (i,1,tot) t[len[i]]++;
    22     rep (i,1,n) t[i]+=t[i-1];
    23     rep (i,1,tot) q[t[len[i]]--]=i;
    24 }
    25 void get_right(){//计算right集合大小
    26     for (int i=tot;i;i--){
    27         int x=q[i];
    28         sz[fa[x]]+=sz[x];
    29     }
    30 }
    SAM
     1 int n,tot,las,ch[N][26],fa[N],len[N]; char s[N];
     2 int get_node(int l){
     3     rep (i,0,25) ch[tot][i]=0;
     4     len[tot]=l; return tot++;
     5 }
     6 int get_fail(int i,int x){
     7     while (s[i-len[x]-1]!=s[i]) x=fa[x];
     8     return x;
     9 }
    10 void init(){
    11     las=tot=0;
    12     get_node(0); get_node(-1);
    13     fa[0]=1;
    14 }
    15 void extend(int i,int c){
    16     int x=get_fail(i,las),y;
    17     if (!ch[x][c]){
    18         y=get_node(len[x]+2);
    19         fa[y]=ch[get_fail(i,fa[x])][c];
    20         ch[x][c]=y;
    21     }
    22     las=ch[x][c];
    23 }
    PAM

    二分图

     1 const int N=512;
     2 int n1,n2,m,a[N][N],match[N],vis[N],ans;
     3 
     4 bool dfs(int u){
     5     rep (v,1,n2) if (a[u][v]&&!vis[v]){
     6         vis[v]=1;
     7         if (!match[v]||dfs(match[v])) return match[v]=u,1;
     8     }
     9     return 0;
    10 }
    11 
    12 int main(){
    13 // Init
    14     rep (i,1,n1){
    15         memset(vis,0,(n2+1)<<2);
    16         if (dfs(i)) ans++;
    17     }
    18 
    19     return 0;
    20 }
    二分图最大匹配 - 匈牙利
     1 const int N=410;
     2 const ll inf=1e15+1;
     3 int n,n1,n2,m,sx[N],sy[N],match[N],L[N],R[N]; ll lx[N],ly[N],w[N][N],val[N];
     4 
     5 bool dfs(int u){
     6     sx[u]=1;
     7     rep (v,1,n) if (!sy[v]){
     8         ll tmp=lx[u]+ly[v]-w[u][v];
     9         if (tmp==0){
    10             sy[v]=1,R[v]=u,L[match[v]]=v;
    11             if (!match[v]||dfs(match[v])) return match[v]=u,1;
    12         } else if (tmp<val[v]) R[v]=u,val[v]=tmp;
    13     }
    14     return 0;
    15 }
    16 
    17 void km(){
    18     rep (i,1,n){
    19         lx[i]=-inf,ly[i]=match[i]=0;
    20         rep (j,1,n) lx[i]=max(lx[i],w[i][j]);
    21     }
    22     rep (x,1,n){
    23         rep (i,1,n) val[i]=inf,sx[i]=sy[i]=L[i]=R[i]=0;
    24         int u,v=0;
    25         for (u=x;u&&!dfs(u);L[u=match[v]]=v){
    26             ll dlt=inf;
    27             rep (i,1,n) if (!sy[i]&&val[i]<dlt) dlt=val[v=i];
    28             rep (i,1,n){
    29                 if (sx[i]) lx[i]-=dlt;
    30                 if (sy[i]) ly[i]+=dlt; else val[i]-=dlt;
    31             }
    32             sy[v]=1;
    33         }
    34         while (u!=x) u=L[u],match[u]=R[u],u=R[u];
    35     }
    36 }
    二分图最大权匹配 - KM
  • 相关阅读:
    如何设置body高度为浏览器高度
    h5的video下载按钮如何隐藏
    微信小程序中的子父组件传值问题
    elementUI级联选择器2(选择及回显)编辑保存
    elementUI级联选择器(选择及回显)
    vue+elementUI 表格操作行的增删改查
    单独验证非form表单中的input(限制)
    JS中去除数组中的假值(0, 空,undefined, null, false)
    vue 组件之间的传值 (父子传值、兄弟传值)
    http协议的状态码
  • 原文地址:https://www.cnblogs.com/bestFy/p/10141401.html
Copyright © 2011-2022 走看看