1.gcd

int gcd(int x,int y)
{
    return y?gcd(y,x%y):x;
}

2.高精度板子(建议使用java和py,哭)

https://www.cnblogs.com/ihxing/p/12916744.html

3.欧拉筛(打表)

int prime[1100000],primesize,phi[11000000];
bool isprime[11000000];
void getlist(int listsize)
{
    memset(isprime,1,sizeof(isprime));
    isprime[1]=0;
    for(int i=2;i<=listsize;i++)
    {
        if(isprime[i])prime[++primesize]=i;
         for(int j=1;j<=primesize&&i*prime[j]<=listsize;j++)
         {
            isprime[i*prime[j]]=0;
            if(i%prime[j]==0)break;
        }
    }
}

4.exgcd&逆元

ll exgcd(ll a,ll b,ll &x,ll &y)
{
    ll d,t;
    if(!b){x=1;y=0;return a;}
    d=exgcd(b,a%b,x,y);
    t=x-a/b*y;x=y;y=t;
    return d;
}
ll inv(ll t,ll p)
{
    ll x,y;
    ll d=exgcd(t,p,x,y);
    return d==1?(x%p+p)%p:-1;
}

5.快速幂

ll ksm(int a,int b)
{
    if(b==1)return a;
    if(b%2==1)return (ksm(a,b/2)*ksm(a,(b+1)/2))%1000;
    else return (ksm(a,b/2)*ksm(a,b/2))%1000;
}

6.dfs

int dfs(int k)
{
    if(特判){
        ...
        return;
    }
    if(越界/结束){
        return
    }
    for(扩展){
        if(满足条件){
            标记;
            dfs(k+1);
            回溯;
        }
    }
}

7.dij

void Dijstra()
{
    int i,j;
    for(i=0; i<n; ++i)
    {
        dis[i]=INF;
        vis[i]=0;
    }
    dis[1]=0;
    int v;
    for(i=1; i<=n; ++i)
    {
        min=INF;
        for(j=1; j<=n; ++j)
        {
            if(!vis[j]&&d[j]<min) //每次找点的过程,首先这个点没有被发现,然后找一个最小点
            {
                min=d[j];
                v=j;
            }
        }
        vis[v]=1;
        for(j=1; j<=n; ++j) //加进最小点后,再修改从源点没有被发现的点的最短路径
        {
            if(!vis[j]&&dis[v]+mp[v][j]<dis[j])
                dis[j]=dis[v]+mp[v][j];
        }
    }
    int ans=-1;
    for(i=1; i<=n; ++i)
        if(dis[i]>ans)
            ans=dis[i];
}
8.悬线法
//处理l
    for(i=1;i<=m;i++)
        for(j=2;j<=n;j++)//从左往右
        if(s[i][j]==1&&s[i][j-1]==1)//根据题意更改
        l[i][j]=l[i][j-1];
    //处理r
    for(i=1;i<=m;i++)
        for(j=n-1;j>=1;j--)
        if(s[i][j]==1&&s[i][j+1]==1)
        r[i][j]=r[i][j+1];
    //up
    for(i=1;i<=m;i++){
        for(j=1;j<=n;j++){
            if(i>1&&s[i][j]==1&&s[i-1][j]==1){
                r[i][j]=min(r[i][j],r[i-1][j]);
                l[i][j]=max(l[i][j],l[i-1][j]);
                up[i][j]=up[i-1][j]+1;
            }
        //根据题意
        ans=max(ans,(r[i][j]-l[i][j]+1)*up[i][j]);
        }
    }