高精度:
重载运算符版:
#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; }
普通高精度:
#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; }
快速幂:
#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; }
判断回文数:
#includeusing 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; }
并查集:
#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; }
归并排序:
#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; }
进制转换:
#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; }
逆元:
#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; }
分解质因数:
#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; }
二叉搜索树:
#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; }
线性筛:
#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; }
裴蜀定理:
#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; }
哈希碰撞:
#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; }
测空间:
#include#include using namespace std; int a[100000005]; int main(void) { int sum=sizeof(a); printf("%d\n",sum/1024/1024); return 0; }
一行gcd :
int gcd(int a,int b){ return b ? gcd(b,a%b) : a;}
线段树模板:
#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; }