提交记录 5102


用户 题目 状态 得分 用时 内存 语言 代码长度
foreverpiano 1005a. 【模板题】高精度除法 Compile Error 0 0 ns 0 KB C++ 8.28 KB
提交时间 评测时间
2018-08-06 19:06:41 2020-08-01 00:10:43
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;
typedef long long LL;
/* 
   大数模板8 
   1.  支持大数之间的+、-、*、/、%运算,以及一些基础的计算 
   2.  支持部分大数与整型之间的运算 (仅限于大数在前整型在后) +、-、*、/、% 
   3.  支持负数的运算,不会出现减法的时候由于被减数小于减数所造成的报错。 
   4.  快速幂,代码优化 
   5.  可以进行正常的比较。 
   6.  新增 abs(), read()两个方便的函数 
   read() 具体用法 
   1. read('c',Var_Name<BigInt>)  读入一个char数组类型转化而来的大数 
   2. read('i',Var_Name<BigInt>)  读入一个int类型转化而来的大数 
   3. read('L',Var_Name<BigInt>)  读入一个long long类型转化而来的大数 
   7.  修复原先模板中关于0的bug 
   8.  新增构造函数 
   9.  修复若干bug,新增一些功能  
   10. progress: 9位压位,大大提高效率 
*///版权所有--周镇东 
const int MaxLen=10010;
const LL mod=1e9;
const LL Pow10[9]={1e0,1e1,1e2,1e3,1e4,1e5,1e6,1e7,1e8};
struct BigInt{
  LL d,v[MaxLen+5];
  bool f;//保存正负性 ,0当作正数看待 
  BigInt (){}
  BigInt (LL x){(*this)=x;}
  BigInt (int x){(*this)=x;}
  BigInt (char x[]){(*this)=x;}
  BigInt (const BigInt &x){(*this)=x;}
    void Print(){
        if (f)
            putchar('-');
        if (d==0){
            putchar('0');
            return;
        }
        printf("%lld",v[d]);
        for (int i=d-1;i>=1;i--)
            printf("%09lld",v[i]);
    }
    void Print(char c){//输出数字 
        (*this).Print();
        printf("%c",c);
    }
    void ya(){
        LL v_[MaxLen];
        memset(v_,0,sizeof v_);
        for (int i=1;i<=d;i++)
            v_[(i-1)/9+1]+=Pow10[(i-1)%9]*v[i];
        d=(d-1)/9+1;
        memset(v,0,sizeof v);
        for (int i=1;i<=d;i++)
            v[i]=v_[i];
        while (d>0&&v[d]==0)
            d--;
    }
    void operator =(char x[]){
        f=x[0]=='-',d=strlen(x)-f,memset(v,0,sizeof v);
        for (int i=f;i<d+f;i++)
            v[i-f+1]+=(x[d+f-(i-f)-1]-48);
        while (d>0&&v[d]==0)
            d--;
        (*this).ya();
    }
    void operator =(int x){
        (*this)=(LL)x;
    }
    void operator =(LL x){
        d=0,f=x<0,x=abs(x);
        memset(v,0,sizeof v);
        while (x)
            v[++d]=x%mod,x/=mod;
    }
    bool equ(BigInt &x){//cmp abs
        if (d!=x.d)
            return 0;
        for (int i=1;i<=d;i++)
            if (v[i]!=x.v[i])
                return 0;
        return 1;
    }
    bool operator ==(BigInt &x){//cmp abs
        if (f!=x.f) 
            return 0;
        return (*this).equ(x);
    }
    bool nequ(BigInt &x){
        return !(*this).equ(x);
    }
    bool operator !=(BigInt &x){
        return !(*this==x);
    }
    bool smaller(BigInt &x){
        if (d!=x.d)
            return d<x.d;
        for (int i=d;i>=1;i--)
            if (v[i]!=x.v[i])
                return v[i]<x.v[i];
        return 0;
    }
    bool bigger(BigInt &x){
        if (d!=x.d)    
            return d>x.d;
        for (int i=d;i>=1;i--)
            if (v[i]!=x.v[i])
                return v[i]>x.v[i];
        return 0;
    }
    bool operator <(BigInt &x){//cmp abs
        if (f!=x.f) 
            return f;
        if (f&&x.f) 
            return (*this).bigger(x);
        return (*this).smaller(x);
    }
    bool operator >(BigInt &x){
        if (f!=x.f) 
            return x.f;
        if (f&&x.f) 
            return (*this).smaller(x);
        return (*this).bigger(x);
    }
    bool smqu(BigInt &x){
        return !(*this).bigger(x);
    }
    bool bgqu(BigInt &x){
        return !(*this).smaller(x);
    }
    bool operator <=(BigInt &x){
        return !(*this>x);
    }
    bool operator >=(BigInt &x){
        return !(*this<x);
    }
    BigInt operator +(BigInt x){//加法运算 
        BigInt Ans=*this;
        if (f!=x.f){
            Ans.f=x.f=0;
            if (f)
                return x-Ans;
            else
                return Ans-x;
        }
        memset(Ans.v,0,sizeof Ans.v);
        Ans.f=f,Ans.d=max(d,x.d);
        for (int i=1;i<=Ans.d;i++)
            Ans.v[i]=v[i]+x.v[i];
        for (int i=1;i<=Ans.d;i++)
            Ans.v[i+1]+=Ans.v[i]/mod,Ans.v[i]%=mod;
        if (Ans.v[Ans.d+1])    
            Ans.d++;
        if (Ans.d==0)
            Ans.f=0;
        return Ans;
    }
    BigInt operator +(const LL x){
        BigInt X(x);
        return X+(*this);
    }
    BigInt operator -(BigInt y){//减法运算 
        BigInt Ans=*this;
        if (f!=y.f){
            y.f=Ans.f,Ans=Ans+y;
            return Ans;
        }
        if (Ans.equ(y)){
            Ans=0;
            return Ans;
        }
        if (Ans.smaller(y)){
            Ans=y-Ans,Ans.f=!f;
            return Ans;
        }
        for (int i=1;i<=max(Ans.d,y.d);i++)
            if (Ans.v[i]-y.v[i]<0)
                Ans.v[i]+=mod-y.v[i],Ans.v[i+1]--;
            else
                Ans.v[i]-=y.v[i];
        while (Ans.d>0&&Ans.v[Ans.d]==0)
            Ans.d--;
        if (Ans.d==0) 
            Ans.f=0;
        return Ans;
    }
    BigInt operator -(const LL x){
        BigInt Ans(x);
        return (*this)-Ans;
    }
    BigInt operator *(const BigInt &y){//乘法运算 
        BigInt x=*this,Ans(0);
        Ans=0,Ans.f=f^y.f;
        for (int i=1;i<=x.d;i++)
            for (int j=1;j<=y.d;j++){
                LL now=Ans.v[i+j-1]+x.v[i]*y.v[j];
                Ans.v[i+j-1]=now%mod;
                Ans.v[i+j]+=now/mod;
            }
        Ans.d=x.d+y.d-1;
        for (int i=1;i<=Ans.d;i++)
            Ans.v[i+1]+=Ans.v[i]/mod,Ans.v[i]%=mod;
        if (Ans.v[Ans.d+1])    
            Ans.d++;
        if (Ans.d==0)
            Ans.f=0;
        return Ans;
    }
    BigInt operator *(LL y){
        BigInt Ans=*this;
        if (y<0) 
            Ans.f^=1;
        y=abs(y);
        for (int i=1;i<=d;i++)
            Ans.v[i]*=y;
        for (int i=1;i<=d||Ans.v[i]>0;i++)
            Ans.v[i+1]+=Ans.v[i]/mod,Ans.v[i]%=mod,Ans.d=max(d,i);
        if (Ans.d==0) 
            Ans.f=0;
        return Ans;
    }
    BigInt operator /(BigInt y){//除法运算 
        BigInt Ans(0),x=*this,minus;
        bool Ansf=f^y.f;
        x.f=y.f=0,minus=y;
        while ((minus*10).smqu(x))
            minus=minus*10;
        while (minus.bgqu(y)){
            Ans=Ans*10;
            while (minus.smqu(x))
                x=x-minus,Ans=Ans+1;
            minus=minus/10;
        }
        Ans.f=Ansf;
        if (Ans.d==0) 
            Ans.f=0;
        return Ans;
    }
    BigInt operator /(LL x){
        BigInt Ans(0);
        LL prev=0;
        Ans.f=f^(x<0),Ans.d=0,x=abs(x);
        for (int i=d;i>0;i--){
            prev=prev*mod+v[i];
            if (prev>=x)
                Ans.v[i]=prev/x,prev%=x,Ans.d=max(Ans.d,i);
        }
        if (Ans.d==0) 
            Ans.f=0;
        return Ans;
    }
    BigInt operator %(BigInt y){//取模运算 
        BigInt x=*this,minus;
        bool xfz=f^y.f;
        x.f=y.f=0,minus=y;
        if (x<y){
            x.f=xfz;
            return x;
        }
        while ((minus*10).smqu(x))
            minus=minus*10;
        while (minus.bgqu(y)){
            while (minus.smqu(x))
                x=x-minus;
            minus=minus/10;
        }
        x.f=xfz;
        if (x.d==0) 
            x.f=0;
        return x;
    }
    LL operator %(LL x){
        LL prev=0;
        bool flag=f^(x<0);
        x=abs(x);
        for (int i=d;i>0;i--)
            prev=prev*mod+v[i],prev%=x;
        if (flag) 
            prev=-prev;
        return prev;
    }
    BigInt operator ^(int x){
        BigInt Ans;
        Ans=1;
        if (x==0)
            return Ans;
        Ans=*this^(x/2);
        Ans=Ans*Ans;
        if (x&1)
            Ans=Ans**this;
        return Ans;
    }
}zero(0),one(1);
BigInt GcdY(BigInt x,BigInt y){
    return y!=zero?GcdY(y,x%y):x;
}
BigInt Gcd(BigInt x,BigInt y){
    x.f=y.f=0;
    if (x==zero)
        return y;
    if (y==zero)
        return x;
    return GcdY(x,y);
}
BigInt LcmY(BigInt x,BigInt y){
    return x/GcdY(x,y)*y;
}
BigInt Lcm(BigInt x,BigInt y){
    x.f=y.f=0;
    if (x==zero)
        return y;
    if (y==zero)
        return x;
    return LcmY(x,y);
}
BigInt abs(BigInt x){
    x.f=0;
    return x;
}
void read(char ch,BigInt &x){
    if (ch=='c'){
        char str[MaxLen];
        scanf("%s",str),x=str;
    }
    if (ch=='i'){
        int y;
        scanf("%d",&y),x=y;
    }
    if (ch=='L'){
        LL y;
        scanf("%lld",&y),x=y;
    }
}
void readint(BigInt &x,int &ret){
    scanf("%d",&ret),x=ret;
}
void readLL(BigInt &x,LL &ret){
    scanf("%lld",&ret),x=ret;
}
int main(){
    BigInt A,B;
    LL a,b;
    readLL(A,a),readLL(B,b);
    (A/B).Print('\n');
    return 0;
}

CompilationN/AN/ACompile ErrorScore: N/A


Judge Duck Online | 评测鸭在线
Server Time: 2026-04-12 11:10:18 | Loaded in 1 ms | Server Status
个人娱乐项目,仅供学习交流使用 | 捐赠