【Templates】一些常用的板子~~

高精:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN=100000,B=100000000,MAXM=3000;
int A[MAXN+5];
namespace Huge_int {
    using namespace std;
    struct huge_int {
        int n;
        int a[MAXM+5];
        inline void clear() { memset(a,0,sizeof(a));n=0; }
        inline void work() { while(n>1 && !a[n]) n--; }
        inline huge_int rd() {
            memset(A,0,sizeof(A));
            clear();
            char ch=getchar();
            while(ch<'0' || ch>'9') ch=getchar();
            while(ch<='9' && ch>='0') A[++n]=ch-'0',ch=getchar();
            for(int i=1;i+i<=n;++i) swap(A[i],A[n-i+1]);
   			for(int i=1;i<=n;i+=8){
                int j=(i+7)/8;
                a[j]=(A[i]+A[i+1]*10+A[i+2]*100+A[i+3]*1000+A[i+4]*10000+A[i+5]*100000+A[i+6]*1000000+A[i+7]*10000000);
            }
            n=(n+7)/8;
            return *this;
        }
        inline huge_int wrt() const {
            printf("%lld",a[n]);
            for(int i=n-1;i>=1;--i) printf("%08lld",a[i]);
            putchar('\n');
            return *this;
        }
        inline bool operator < (const huge_int &nt) const {
            if(n<nt.n) return 1;
            if(n>nt.n) return 0;
            for(int i=n;i>=1;--i)
                if(a[i]!=nt.a[i])return a[i]<nt.a[i];
            return 0;
        }
        inline bool operator > (const huge_int &nt) const {
            return nt<*this;
        }
        inline bool operator != (const huge_int &nt) const {
            return (*this<nt) || (nt<*this);
        }
        inline bool operator == (const huge_int &nt) const {
            return !(*this!=nt);
        }
        inline huge_int operator = (const int &nt) {
            n=0;
            int x=nt;
            while(x){
                a[++n]=x%B;
                x/=B;
            }
            return *this;
        }
        inline huge_int operator + (const huge_int &nt) const {
            huge_int tmp;
            tmp.clear();
            tmp.n=max(n,nt.n)+1;
            for(int i=1;i<=tmp.n;++i){
                tmp.a[i]+=a[i]+nt.a[i];
                tmp.a[i+1]+=tmp.a[i]/B;
                tmp.a[i]%=B;
            }
            tmp.work();
            return tmp;
        }
        inline huge_int operator - (const huge_int &nt) const {
            huge_int tmp;
            tmp.clear();
            int x=0;
            tmp.n=n;
            for(int i=1;i<=tmp.n;++i){
                x+=a[i]-nt.a[i];
                if(x<0) tmp.a[i]=x+B,x=-1;
                else tmp.a[i]=x,x=0;
            }
            tmp.work();
            return tmp;
        }
  		inline huge_int operator * (const huge_int &nt) const {
            huge_int tmp;
            tmp.clear();
            tmp.n=n+nt.n;
            for(int i=1;i<=n;++i)
                for(int j=1;j<=nt.n;++j){
                    tmp.a[i+j-1]+=a[i]*nt.a[j];
                    tmp.a[i+j]+=tmp.a[i+j-1]/B;
                    tmp.a[i+j-1]%=B;
                }
            for(int i=1;i<=tmp.n;++i){
                tmp.a[i+1]+=tmp.a[i]/B;
                tmp.a[i]%=B;
            }
            tmp.work();
            return tmp;
        }
  		inline huge_int operator / (const int &nt) const {
            huge_int tmp;
            tmp.clear();
            int x=0;
            tmp.n=n;
            for(int i=n;i>=1;--i){
                x=x*B+a[i];
                tmp.a[i]=x/nt;
                x%=nt;
            }
            tmp.work();
            return tmp;
        }
        inline huge_int operator += (const huge_int &nt) { return *this=*this+nt; }
        inline huge_int operator -= (const huge_int &nt) { return *this=*this-nt; }
        inline huge_int operator *= (const huge_int &nt) { return *this=*this*nt; }
        inline huge_int operator /= (const int      &nt) { return *this=*this/nt; }
    };
 	inline huge_int gcd(huge_int a,huge_int b) {
        int na=0,nb=0;
        while(!(a.a[1]&1)) na++,a/=2;
        while(!(b.a[1]&1)) nb++,b/=2;
        int x=min(na,nb);
        while(a!=b){
            if(a<b) swap(a,b);
            a=a-b;
            while(!(a.a[1]&1)) a/=2;
        }
        huge_int t;
        t=2;
        while(x--) a*=t;
        return a;
    }
}
using namespace Huge_int;
using namespace std;
huge_int a,b;
signed main(){
    if(fopen("T1.in","r")){
        freopen("T1.in","r",stdin);
        freopen("T1.out","w",stdout);
    }
    a.rd();b.rd();
    gcd(a,b).wrt();
    return 0;
}

矩阵乘法和快速幂:

namespace Matrix {
	using namespace std;
	const int p=2009;
	struct matrix {
		int a[MAXN+5][MAXN+5];
		int n,m;
		inline void set(const int &nx) {
			for(int i=1;i<=nx;++i) a[i][i]=1;
			n=m=nx;
		}
		inline void clear(){ n=m=0;memset(a,0,sizeof(a)); }
		inline matrix operator * (const matrix &b) const {
			matrix ret;ret.clear();
			ret.n=n;ret.m=b.m;
			for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)for(int k=1;k<=b.m;++k)
				ret.a[i][j]=(ret.a[i][j]+a[i][k]*b.a[k][j]%p)%p;
			return ret;
		}
		inline matrix operator *= (const matrix &b) { return *this=*this*b; }
		inline void wrt() {
			for(int i=1;i<=n;++i){
				for(int j=1;j<=m;++j) printf("%d ",a[i][j]);
				putchar('\n');
			}
		}
	};
	inline matrix power(matrix a,int b) {
		matrix ret;ret.clear();ret.set(a.n);
		for(;b;a*=a,b>>=1)if(b&1)ret*=a;
		return ret;
	}
}

拉链hash:

namespace Hash{
	const int mod=100007;
	struct HashTable {
		struct Link { int val1,val2,next;}E[N];
		int head[mod],cnt;
		inline void add(int u,int v,int w) {
			E[++cnt].next=head[u];
			E[cnt].val1=v;
			E[cnt].val2=w;
			head[u]=cnt;
		}
		inline void insert(int x,int k) {
			int s=x%mod;
			add(s,x,k);
		}
		inline void clear() {
			memset(head,0,sizeof(head));
			cnt=0;
		}
		inline int locate(int x) {
			int s=x%mod;
			for(int i=head[s];i;i=E[i].next)
				if(E[i].val1==x) return E[i].val2;
			return -1;
		}
	}H;
}
posted @ 2019-04-02 21:06  章鱼那个哥  阅读(219)  评论(0编辑  收藏  举报