辣鸡模板库

Pollard Rho

LL MO(LL q,LL w,LL mo)
{
    LL ans=0;
    for(;w;w>>=1,q=(q+q)%mo)if(w&1)ans=(ans+q)%mo;
    return ans;
}
LL ksm(LL q,LL w,LL mo)
{
    LL ans=1;
    for(;w;w>>=1,q=MO(q,q,mo))if(w&1)ans=MO(ans,q,mo);
    return ans;
}
LL RD(LL mo){return (LL)rand()*(LL)rand()%mo;}
bool MillerR(LL q)
{
    if(q==2||q==3||q==5||q==7||q==11||q==13)return 1;
    if(q==1||!(q&1)||!(q%3)||!(q%5)||!(q%7)||!(q%11)||!(q%13))return 0;
    fo(i,1,5)if(ksm(RD(q-1)+1,q-1,q)!=1)return 0;
    return 1;
}
LL gcd(LL x,LL y){return y<1?x:(gcd(y,x%y));}
void PollarR(LL n)
{
    if(!(n&1))for(;!(n&1);n>>=1)pr[++pr[0]]=2;
    if(n<2)return;
    if(MillerR(n)){pr[++pr[0]]=n;return;}
    LL x1=0,x2=0,C,P=1;
    printf("%lld\n",n);
    for(;P<2||P==n;P=gcd(abs(x1-x2),n))
    {
        x2=(MO(x2,x2,n)+C)%n,x2=(MO(x2,x2,n)+C)%n;
        x1=(MO(x1,x1,n)+C)%n;
        while(x1==x2)x1=C=RD(n),x2=(MO(C,C,n)+C)%n;
    }
    PollarR(P);
    PollarR(n/P);
}

Treap

struct qqww
{
    int l,r,fa,si,rd,v;
    LL ans;
}b[N];
void merge(int q)
{
    b[q].si=b[b[q].l].si+b[b[q].r].si+1;
    b[q].ans=b[b[q].l].ans+b[b[q].r].ans+b[q].v;
}
void build(int q)
{
    if(b[q].l)build(b[q].l);
    if(b[q].r)build(b[q].r);
    merge(q);
}
void build_treap()
{
    int la,w;
    n++;b[n].rd=2e9;
    fo(i,1,n)
    {
        int la=0;
        for(;za[0]&&b[za[za[0]]].rd<b[i].rd;za[0]--)
        {
            la=w=za[za[0]];
            if(za[0]-1)b[w].fa=za[za[0]-1],b[za[za[0]-1]].r=w;
        }
        if(i>n)break;
        b[i].l=la;
        b[la].fa=i;
        za[++za[0]]=i;
    }
    root=n;
    build(root);
}
int findS(int q,int si)
{
    if(b[b[q].l].si<=si)return findS(b[q].l,si);
    si-=b[b[q].l].si+1;
    if(!si)return q;
    return findS(b[q].r,si);
}
TRP split(int q,int si)
{
    if(!si)return TRP(0,q);
    TRP t;
    if(si<=b[b[q].l].si)
    {
        t=split(b[q].l,si);
        b[q].l=t.second;
        t.second=q;
    }else
    {
        t=split(b[q].r,si-1-b[b[q].l].si);
        b[q].r=t.first;
        t.first=q;
    }
    merge(q);
    return t;
}
int amalgamate(int q,int w)
{
    if(!q||!w)return q+w;
    if(b[q].rd>b[w].rd)
    {
        b[q].r=amalgamate(b[q].r,w);
        merge(q);
        return q;
    }
    b[w].l=amalgamate(q,b[w].l);
    merge(w);
    return w;
}

FFT

struct FFT
{
    db x,y;
    FFT(db _x=0,db _y=0){x=_x;y=_y;}
    friend FFT operator +(FFT q,FFT w){return FFT(q.x+w.x,q.y+w.y);}
    friend FFT operator -(FFT q,FFT w){return FFT(q.x-w.x,q.y-w.y);}
    friend FFT operator *(FFT q,FFT w){return FFT(q.x*w.x-q.y*w.y,q.x*w.y+q.y*w.x);}
}a[N],b[N],ans[N],c[N],ans1[N],a1[N];
void DFT(FFT *a,int K,int n,int ws)
{
    fo(i,0,n-1)
    {
        int q=0;
        for(int j=i,k=ws;k;k--,j>>=1)q=(q<<1)+(j&1);
        c[q]=a[i];
    }
    for(int I=2;I<=n;I<<=1)
    {
        int mid=I/2;
        fo(j,0,mid-1)
        {
            FFT w(cos(j*PI*K/mid),sin(j*PI*K/mid));
            for(int i=j;i<n;i+=I)
            {
                FFT q=w*c[i+mid];
                c[i+mid]=c[i]-q;c[i]=c[i]+q;
            }
        }
    }
    fo(i,0,n-1)a[i]=c[i];
    if(K<0)fo(i,0,n-1)a[i].x=a[i].x/n;
}
void FFT(FFT *a,FFT *b,FFT *ans,int n)
{
    int m=1,ws=1;
    for(;m<=n;m<<=1,ws++);
    m<<=1;
    fo(i,n+1,m)a[i].x=a[i].y=0,b[i]=a[i];
    DFT(a,1,m,ws);
    DFT(b,1,m,ws);
    fo(i,0,m-1)ans[i]=a[i]*b[i];
    DFT(ans,-1,m,ws);
}

NNT

struct DXS
{
    int n,ws;
    LL f[N*4],fn[N*4],g[N*4],c[N*4],cc[N*4],c1[N*4],c2[N*4];
    LL W[N*4],W0;
    int Pre(int m)
    {
        ws=0;
        for(W0=1;W0<=m;ws++,W0<<=1);
        n=W0;W0<<=1;
        W[0]=1;W[1]=ksm(3,(mo-1)/W0);
        fo(i,2,W0)W[i]=W[i-1]*W[1]%mo;
        return ws;
    }
    void DFT(LL *a,int n,int ws,int K)
    {
        fo(i,0,n-1)
        {
            int q=0;
            for(int j=i,k=ws;k;--k,j>>=1)q=(q<<1)+(j&1);
            c[q]=a[i];
        }
        for(int I=2;I<=n;I<<=1)
        {
            int mid=I>>1;
            fo(j,0,mid-1)
            {
                LL w=(K>0)?(W[W0/I*j]):(W[W0-W0/I*j]);
                for(int i=j;i<n;i+=I)
                {
                    LL t=c[i+mid]*w%mo;
                    c[i+mid]=(c[i]-t)%mo;
                    c[i]=(c[i]+t)%mo;
                }
            }
        }
        if(K<0)
        {
            LL t=ksm(n,mo-2);
            fo(i,0,n-1)c[i]=c[i]*t%mo;
        }
    }
    void NNT(LL *a,LL *b,LL *Ans,int n,int ws)
    {
        DFT(a,n,ws,1);
        fo(i,0,n-1)cc[i]=c[i];
        DFT(b,n,ws,1);
        fo(i,0,n-1)Ans[i]=cc[i]*c[i]%mo;
        DFT(Ans,n,ws,-1);
        fo(i,0,n-1)Ans[i]=c[i];
    }
    void NNT(LL *a,LL *Ans,int n,int ws)
    {
        DFT(a,n,ws,1);
        fo(i,0,n-1)Ans[i]=c[i]*c[i]%mo;
        DFT(Ans,n,ws,-1);
        fo(i,0,n-1)Ans[i]=c[i];
    }
    void GNY(LL *f,LL *fn)
    {
        fn[0]=ksm(f[0],mo-2);c2[0]=f[0];
        for(int I=2,j=1;I<=n;I<<=1,++j)
        {
            fo(i,(I>>1),I-1)c2[i]=f[i];
            DFT(fn,(I<<1),j+1,1);
            fo(i,0,(I<<1)-1)c1[i]=c[i];
            DFT(c2,(I<<1),j+1,1);
            fo(i,0,(I<<1)-1)fn[i]=(2LL*c1[i]-c1[i]*c1[i]%mo*c[i])%mo;
            DFT(fn,(I<<1),j+1,-1);
            fo(i,0,I-1)fn[i]=c[i];
            fo(i,I,(I<<1))fn[i]=0;
        }
    }
    void Doit(int m)
    {
        Pre(m);
        GNY(f,fn);
        NNT(fn,g,c1,n<<1,ws+1);
        ans=c1[m];
    }
}F;

Cipolla(二项式剩余)

#include <cstdio>
#include <algorithm>
#define fo(i,a,b) for(int i=a;i<=b;++i)
#define fod(i,a,b) for(int i=a;i>=b;--i)
#define min(q,w) ((q)>(w)?(w):(q))
#define max(q,w) ((q)<(w)?(w):(q))
using namespace std;
typedef int LL;
const int N=1500;
int mo;
int read(int &n)
{
    char ch=' ';int q=0,w=1;
    for(;(ch!='-')&&((ch<'0')||(ch>'9'));ch=getchar());
    if(ch=='-')w=-1,ch=getchar();
    for(;ch>='0' && ch<='9';ch=getchar())q=q*10+ch-48;n=q*w;return n;
}
int m,n,ans;
LL W;
struct qqww
{
    LL x,y;
    qqww(LL _x=0,LL _y=0){x=_x,y=_y;}
    friend qqww operator *(qqww q,qqww w){return qqww((q.x*w.x+q.y*w.y%mo*W)%mo,(q.x*w.y+q.y*w.x)%mo);}
};
LL ksm(LL q,int w,int Mo)
{
    LL ans=1;q=q%Mo;(q<0?q=q+Mo:0);
    for(;w;w>>=1,q=q*q%Mo)if(w&1)ans=ans*q%Mo;
    return ans;
}
qqww ksm(qqww q,int w,int Mo)
{
    ::mo=Mo;
    qqww ans(1,0);
    for(;w;w>>=1,q=q*q)if(w&1)ans=ans*q;
    return ans;
}
int RD(int mo){return rand()%mo;}
LL Cipolla(int n,int mo)
{
    if(w==2)return 1;
    LL q=ksm(n,(mo-1)>>1,mo);
    if(q==0||q==mo-1)return -1;
    for(q=RD(mo);ksm(q*q-n+mo,((mo-1)>>1),mo)!=mo-1;q=RD(mo));
    qqww t(q,1);W=(q*q-n+mo)%mo;
    t=ksm(t,((mo+1)>>1),mo);
    return (t.x+mo)%mo;
}
int main()
{
    int q,w,_;
    srand(19890604);
    for(read(_);_;_--)
    {
        read(q),read(w);
        ans=Cipolla(q,w);
        if(ans==-1)printf("No root\n");
        else if(ans==w-ans)printf("%d\n",ans);
        else if(ans<w-ans)printf("%d %d\n",ans,w-ans);
        else printf("%d %d\n",w-ans,ans);
    }
    return 0;
}

LL*LL取模

有一种复杂度加多个log的方法,
或者把它拆成两半,
这里还有一种Yves___由提供的黑科技:(巧妙的利用了C++的爆炸特性)

LL mult( LL A, LL B, LL Mo )
{
    LL temp = ( ( LL ) ( ( long double ) A*B/Mo+1e-6 ) * Mo );
    return A*B - temp;
}

这个是CTY大爷的版子

LL MO(LL q,LL w,LL mo) 
{
    q%=mo;w%=mo;
    LL tmp=(LL)((long double)q*w/mo+1e-8)*mo;
    return (q*w-tmp+mo)%mo;
}

(这个可能会错啊QwQ)

SA

int a[N];
int tp[N*2],tpj[N];
int rk[N],sa[N],h[N];
void TP()
{
    int mx=0;
    fo(i,1,n)tpj[rk[tp[i]]]++,mx=max(mx,rk[tp[i]]);
    fo(i,1,mx)tpj[i]+=tpj[i-1];
    fod(i,n,1)sa[tpj[rk[tp[i]]]--]=tp[i];
    fo(i,0,mx)tpj[i]=0;
}
void SA()
{
    fo(i,1,n)tp[i]=i,rk[i]=a[i];TP();
    for(int I=1;I<=n;I*=2)
    {
        int q=0;
        fo(i,n-I+1,n)tp[++q]=i;
        fo(i,1,n)if(sa[i]-I>0)tp[++q]=sa[i]-I;
        TP();
        fo(i,1,n)tp[i]=rk[i];
        q=0;
        fo(i,1,n)
            rk[sa[i]]=(tp[sa[i-1]]!=tp[sa[i]]||tp[sa[i-1]+I]!=tp[sa[i]+I])?(++q):q;
    }
    fo(i,1,n)if(rk[i]>1)
    {
        int q=max(0,h[i-1]-1);
        while(a[i+q]==a[sa[rk[i]-1]+q])q++;
        h[i]=q;
    }
}

Splay辣鸡模板

跑的非常慢,可能是因为struct吧QwQ

void merge(int e)
{
    int l=b[e].l,r=b[e].r;
    b[e].mx=max(b[l].mx,max(b[r].mx,b[e].v));
    b[e].mi=min(b[l].mi,min(b[r].mi,b[e].v));
    b[e].co=b[l].co+b[r].co+1;
}
void UP(int q)
{
    int t=b[q].fa;
    if(b[t].l==q)
    {
        b[t].l=b[q].r;
        b[b[q].r].fa=t;
        b[q].r=t;
    }else
    {
        b[t].r=b[q].l;
        b[b[q].l].fa=t;
        b[q].l=t;
    }
    if(b[b[t].fa].l==t)b[b[t].fa].l=q;
        else b[b[t].fa].r=q;
    b[q].fa=b[t].fa;
    b[t].fa=q;
    merge(t);
    merge(q);
}
bool SD(int q){return q==b[b[q].fa].l;}
void rotate(int q,int w)
{
    while(b[q].fa!=w)
    {
        if(b[b[q].fa].fa!=w)
            if(SD(q)==SD(b[q].fa))UP(b[q].fa);
            else UP(q);
        UP(q);
    }
    if(!w)root=q;
}
int search(int q,int w)
{
    if(b[b[q].l].co>=w)return search(b[q].l,w);
    w-=b[b[q].l].co+1;
    return w?search(b[q].r,w):q;
}

SPFA(带俩优化)

void SPFA(int q)
{
    int S,T;
    d[S=T=1]=q;z[q]=1;
    fo(i,1,n)dis[i]=INF;dis[q]=0;
    LL Alls=0;
    for(;S<=T;)
    {
        q=d[S];++S;
        if((LL)dis[q]*(T-S+2LL)>Alls){d[++T]=q;continue;}
        Alls-=(LL)dis[q];
        efo(i,q)if(dis[B[i][1]]>dis[q]+B[i][2])
        {
            dis[B[i][1]]=dis[q]+B[i][2];
            if(!z[B[i][1]])
            {
                z[B[i][1]]=1;Alls+=(LL)dis[B[i][1]];
                if(dis[B[i][1]]<dis[d[S]])d[--S]=B[i][1];
                else d[++T]=B[i][1];
            }
        }
        z[q]=0;
    }
}

Sublime Text

Sublime Text中的C++编译文件
(我也不知道为什么要放上来)

{
    "encoding": "utf-8",
    "working_dir": "$file_path",
    "shell_cmd": "g++ -Wall -std=c++11 \"$file_name\" -o \"$file_base_name\"",
    "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
    "selector": "source.c++",

    "variants":   
    [
        {     
        "name": "build",
            "shell_cmd": "g++ \"$file\" -o \"$file_base_name\" -g"
        },
        {
        "name": "Run",
            "shell_cmd": "g++ \"$file\" -o \"$file_base_name\" -g && start cmd /c \"\"${file_path}/${file_base_name}\" & pause\""
        },  
        {
        "name": "Run Full Stack",  
            "shell_cmd": "g++ \"$file\" -o \"$file_base_name\" -Wl,--stack=268435456 && start cmd /c \"\"${file_path}/${file_base_name}\" & pause\""  
        },  
        {
        "name": "Run with o2",  
            "shell_cmd": "g++ \"$file\" -o \"$file_base_name\" -Wl,--stack=268435456 && start cmd /c \"\"${file_path}/${file_base_name}\" & pause\""  
        },  
        {
        "name": "Open GDB",  
            "shell_cmd": "start cmd /k gdb \"${file_base_name}\""
        }
    ]
}

猜你喜欢

转载自blog.csdn.net/howarli/article/details/53669023
今日推荐