C++各种模板

高精度:

重载运算符版:

#include
#include
#include
using namespace std;
const int NR=1e4;
char s[NR];
struct Bigint
{
    int num[NR];
    Bigint()
    {
        memset(num,0,sizeof(num));
        num[0]=1;
    }
    void read()
    {
        scanf("%s",s);
        num[0]=strlen(s);
        for(int i=1;i<=num[0];i++)
            num[i]=s[num[0]-i]-'0';
    }
    void print()
    {
        for(int i=num[0];i>=1;i--)
            printf("%d",num[i]);
        puts("");
    }
    Bigint operator + (const Bigint &B) const
    {
        Bigint c;
        c.num[0]=max(num[0],B.num[0]);
        for(int i=1;i<=c.num[0];i++)
        {
            c.num[i]+=num[i]+B.num[i];
            c.num[i+1]+=c.num[i]/10;
            c.num[i]%=10;
        }
        if(c.num[c.num[0]+1]>0) 
            c.num[0]++;
        return c;
    }
};
int main(void)
{
    Bigint a,b,c;
    a.read();
    b.read();
    c=a+b;
    c.print();
    return 0;
}
View Code

普通高精度:

#include
#include
#include
using namespace std;
const int NR=1e3;
char s[NR+5];
int a[NR+5],b[NR+5],c[NR+5];
void read(int a[])
{
    scanf("%s",s);
    a[0]=strlen(s);
    for(int i=1;i<=a[0];i++)
        a[i]=s[a[0]-i]-'0';
}
void print(int a[])
{
    for(int i=a[0];i>=1;i--)
        printf("%d",a[i]);
    puts("");
}
void add(int a[],int b[],int c[])
{
    c[0]=max(a[0],b[0]);
    for(int i=1;i<=c[0];i++)
    {
        c[i]+=a[i]+b[i];
        c[i+1]=c[i]/10;
        c[i]%=10;
    }
    if(c[c[0]+1]>0)
        printf("%d",c[c[0]]+1);
}
int main()
{
    read(a);
    read(b);
    add(a,b,c);
    print(c);
    return 0;
}
View Code

快速幂:

#include
#include
using namespace std;
long long po(long long x,long long p,long long k)
{
    if(p==0)
        return 1;
    if(p==1)
        return x;
    int a=po(x,p/2,k);
    a%=k;
    if(p%2==0)
        return (a*a)%k;
    return (a*a*x)%k;
}
int main(void)
{
    long long x,p,k;
    scanf("%lld%lld%lld",&x,&p,&k);
    printf("%lld^%lld mod %lld=%lld\n",x,p,k,po(x,p,k)%k);
    return 0;
}
View Code

 判断回文数:

#include
using namespace std;
int num[105],len;
bool check(int x)
{
    int tmp=0;
    while(x!=0)
    {
        num[++tmp]=x%10;
        x/=10;
        len++;
    }
    for(int i=1;i<=len/2;i++)
        if(num[i]!=num[len+1-i])
            return false;
    return true;
}
int main()
{
    int n;
    scanf("%d",&n);
    if(check(n)==true)
        printf("YES\n");
    else
        printf("NO\n");
    return 0;
}
View Code

并查集: 

#include
#include
using namespace std;
const int NR=1e5;
int n,m;
int bin[NR+5],tot;
int anc(int x)
{
    if(bin[x]==0)
        return x;
    bin[x]=anc(bin[x]);
    return bin[x];
}
void link(int u,int v)
{
    u=anc(u);
    v=anc(v);
    if(u!=v)
    {
        bin[u]=v;
        tot--;
    }
}
struct road
{
    int x,y,t;
    void inp()
    {
        scanf("%d%d%d",&x,&y,&t);
    }
    friend bool operator < (road A,road B)
    {
        return A.t<B.t;
    }
};
road s[NR+5];
void inp()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
        s[i].inp();
    tot=n;
}
void ask(int u,int v)
{
    if(anc(u)==anc(v))
        printf("Yes\n");
    else
        printf("No\n");
}
void calc()
{
    sort(s+1,s+m+1);
    int i;
    for(i=1;i<=m;i++)
    {
        link(s[i].x,s[i].y);
        if(tot==1)
            goto finish;
    }
    printf("-1\n");
    return;
    finish:
    printf("%d\n",s[i].t);
}
int main(void)
{
    inp();
    calc();
    return 0;
}
View Code

归并排序:

#include
#include
#include
using namespace std;
const int NR=5e5;
int n;
int a[NR+5],tmp[NR+5];
void marge(int l,int r,int mid)   
{
    int sum=r-l+1,t=0;
    int disl=l,disr=mid+1;
    while(disl<=mid&&disr<=r)
    {
        if(a[disl]>a[disr])
        {           
            t++;
            tmp[t]=a[disr];    
            disr++;
        }
        else
        {
            t++;
            tmp[t]=a[disl];
            disl++;
        }
    }
    while(disl<=mid)
    {       
        t++;
        tmp[t]=a[disl];
        disl++;
    }
    while(disr<=r)
    {        
        t++;
        tmp[t]=a[disr];
        disr++;
    }
    for(int i=1;i<=sum;i++)
        a[l+i-1]=tmp[i];
    return;
}
void cha(int l,int r)
{
    if(l==r)
        return;
    int mid=(l+r)>>1;
    cha(l,mid);
    cha(mid+1,r);
    marge(l,r,mid);
    return;
}
int main(void)
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    cha(1,n);
    for(int i=1;i<=n;i++)
        printf("%lld ",a[i]);
    puts("");
    return 0;
}
View Code

进制转换:

#include
#include
using namespace std;
int len[105],tmp=1;
void change(int n,int a,int b)
{
    int n_10=0;
    int fu=n;
    while(fu)
    {
        n_10+=fu%10*tmp;
        tmp*=a;
        fu/=10;
    }
    fu=n_10;
    tmp=0;
    while(fu)
    {
        len[++tmp]=fu%b;
        fu/=b;
    }
}
int main()
{
    int n,a,b;
    scanf("%d%d%d",&n,&a,&b);
    change(n,a,b);
    for(int i=tmp;i>=1;i--)
        printf("%d",len[i]);
    puts("");
    return 0;
}
View Code

逆元:

#include
#include
using namespace std;
int main(void)
{
    int p;
    scanf("%d",&p);
    int inv[p+5];
    inv[1]=1;
    for(int i=2;i<=p-1;i++)
        inv[i]=(p-p/i)*inv[p%i]%p;
    for(int i=1;i<=p-1;i++)
        printf("%d\n",inv[i]);
    return 0;
}
View Code

分解质因数: 

#include
#include
#include
using namespace std;
int p[100005];
int factor(int x,int p[])
{
    int cnt=0;
    for(int i=2;i*i<=x;i++)
        while(x%i==0)
        {
            p[++cnt]=i;
            x/=i;
        }
    if(x>1)
        p[++cnt]=x;
    return cnt;
}
int main(void)
{
    int n;
    scanf("%d",&n);
    printf("%d\n",factor(n,p));
    return 0;
}
View Code

二叉搜索树:

#include
#include
#include
using namespace std;
const int NR=1e5;
struct note
{
    int val,w;
    int lc,rc;
}T[NR+5];
int n,cnt,a[NR+5];
void ins(int o,int v)
{
    if(!T[o].val)
    {
        T[o].val=v;
        T[o].w++;
        return;
    }
    if(T[o].val==v)
    {
        T[o].val++;
        return;
    }
    if(v<T[o].val)
    {
        if(!T[o].lc)
            T[o].lc=++cnt;
        ins(T[o].lc,v);
    }
    if(v>T[o].val)
    {
        if(!T[o].rc)
            T[o].rc=++cnt;
        ins(T[o].rc,v);
    }
}
void dfs(int o)
{
    if(!T[o].val)
        return;
    if(T[o].lc)
        dfs(T[o].lc);
    printf("%d ",T[o].val);
    if(T[o].rc)
        dfs(T[o].rc);
}
int main(void)
{    
    scanf("%d",&n);
    cnt=1;
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    for(int i=1;i<=n;i++)
        ins(1,a[i]);
    dfs(1);
    puts("");
    return 0;
}
View Code

线性筛:

#include
#include
#include
using namespace std;
int main(void)
{
    int n=100;
    bool flag[105];
    memset(flag,false,sizeof(flag));
    for(int i=2;i<=100;i++)
        if(flag[i]==false)
        {
            printf("%d\n",i);
            for(int j=2;i*j<=n;j++)
                flag[i*j]=true;
        }
    return 0;
}
View Code

裴蜀定理:

#include
#include
using namespace std;
#define pr pair
#define x tmp.first;
#define y tmp.second;
pr exged(int a,int b)
{
    if(b==0)
        return pr(1,0);
    pr tmp=exged(b,a%b);
    return pr(y,x-a/b*y);
}
int main(void)
{
    
    return 0;
}
View Code

哈希碰撞:

#include
#include
using namespace std;
struct brute
{
    bool w[1000005];
    void ins(int x)
    {
        w[x]=1;
    }
    void ask(int x)
    {
        printf("%d\n",w[x]);
    }
}
#define ha 233333;
struct naive
{
    bool w[ha+5];
    void ins(int x)
    {
        w[x%ha]=1;
    }
    void ask(int x)
    {
        printf("%d\n",w[x%ha]);
    }
};
/*naive B;
struct zip
{
    vector w[ha+5];
    void ins(int x)
    {
        w[x%ha]
    }
};*/
int main(void)
{
    
    return 0;
}
View Code

测空间:

#include
#include
using namespace std;
int a[100000005];
int main(void)
{
    int sum=sizeof(a);
    printf("%d\n",sum/1024/1024);
    return 0;
}
View Code

 一行gcd : 

int gcd(int a,int b){  return b ? gcd(b,a%b) : a;}
View Code

 线段树模板:

#include
#include
#include
using namespace std;
#define ll long long
const int NR=1e6;
unsigned ll n,m,a[NR+5],ans[4*NR+5],tag[NR*4+5];
inline ll ls(ll x)
{
    return x<<1;
}
inline ll rs(ll x)
{
    return x<<1|1;
}
void scan()
{
    scanf("%lld%lld",&n,&m);
    for(ll i=1;i<=n;i++)
        scanf("%lld",&a[i]);
}
inline void push_up(ll p)
{
    ans[p]=ans[ls(p)]+ans[rs(p)];
}
void build(ll p,ll l,ll r)
{
    tag[p]=0;
    if(l==r)
    {
        ans[p]=a[l];
        return;
    }
    ll mid=(l+r)>>1;
    build(ls(p),l,mid);
    build(rs(p),mid+1,r);
    push_up(p);
}
inline void f(ll p,ll l,ll r,ll k)
{
    tag[p]=tag[p]+k;
    ans[p]=ans[p]+k*(r-l+1);
}
inline void push_down(ll p,ll l,ll r)
{
    ll mid=(l+r)>>1;
    f(ls(p),l,mid,tag[p]);
    f(rs(p),mid+1,r,tag[p]);
    tag[p]=0;
}
inline void update(ll nl,ll nr,ll l,ll r,ll p,ll k)
{
    if(nl<=l&&r<=nr)
    {
        ans[p]+=k*(r-l+1);
        tag[p]+=k;
        return;
    }
    push_down(p,l,r);
    ll mid=(l+r)>>1;
    if(nl<=mid)
        update(nl,nr,l,mid,ls(p),k);
    if(nr>mid)
        update(nl,nr,mid+1,r,rs(p),k);
    push_up(p);
}
ll query(ll q_x,ll q_y,ll l,ll r,ll p)
{
    ll res=0;
    if(q_x<=l&&q_y>=r)
        return ans[p];
    ll mid=(l+r)>>1;
    push_down(p,l,r);
    if(q_x<=mid)
        res+=query(q_x,q_y,l,mid,ls(p));
    if(q_y>mid)
        res+=query(q_x,q_y,mid+1,r,rs(p));
    return res;
}
int main(void)
{
    ll a1,b,c,d,e,f;
    scan();
    build(1,1,n);
    while(m--)
    {
        scanf("%lld",&a1);
        switch(a1)
        {
            case 1:
            {
                scanf("%lld%lld%lld",&b,&c,&d);
                update(b,c,1,n,1,d);
                break;
            }
            case 2:
            {
                scanf("%lld%lld",&e,&f);
                printf("%lld\n",query(e,f,1,n,1));
                break;                
            }
        }
    }
    return 0;
}
View Code

 

你可能感兴趣的:(C++各种模板)