#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=1200;
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;
}
| Compilation | N/A | N/A | Compile Error | Score: N/A | 显示更多 |