예제 #1
0
 int cp3(const Bigint &b)const {
   if (s != b.s) return s > b.s;
   if (s == -1) return -(-*this).cp3(-b);
   if (len() != b.len()) return len()>b.len()?1:-1;
   for (int i=len()-1; i>=0; i--)
     if (v[i]!=b.v[i]) return v[i]>b.v[i]?1:-1;
   return 0;
 }
예제 #2
0
파일: m.cpp 프로젝트: tzupengwang/PECaveros
 int cp3(const Bigint &b)const {
   if (s != b.s) return s - b.s;
   if (s == -1) return -(-*this).cp3(-b);
   if (len() != b.len()) return len()-b.len();//int
   for (int i=len()-1; i>=0; i--)
     if (v[i]!=b.v[i]) return v[i]-b.v[i];
   return 0;
 }
예제 #3
0
Bigint operator + (Bigint a, Bigint b) {
	if (a.len() < b.len()) swap(a, b);
	Bigint c; c.data = a.data, c.data.push_back(0);
	int r = 0;
	for (int i = 0; i < c.len(); i++) {
		c[i] += ((i < b.len()) ? b[i] : 0) + r;
		if ((r = (c[i] >= BASE))) c[i] -= BASE;
	}
	c.trim();
	return c;
}
예제 #4
0
 Bigint operator * (const Bigint &b) {
   Bigint r;
   r.resize(len() + b.len() + 1);
   r.s = s * b.s;
   for (int i=0; i<len(); i++) {
     for (int j=0; j<b.len(); j++) {
       r.v[i+j] += v[i] * b.v[j];
       if(r.v[i+j] >= BIGMOD) {
         r.v[i+j+1] += r.v[i+j] / BIGMOD;
         r.v[i+j] %= BIGMOD;
       }
     }
   }
   r.n();
   return r;
 }
예제 #5
0
 Bigint operator + (const Bigint &b) const {
   if (s == -1) return -(-(*this)+(-b));
   if (b.s == -1) return (*this)-(-b);
   Bigint r;
   int nl = max(len(), b.len());
   r.resize(nl + 1);
   for (int i=0; i<nl; i++) {
     if (i < len()) r.v[i] += v[i];
     if (i < b.len()) r.v[i] += b.v[i];
     if(r.v[i] >= BIGMOD) {
       r.v[i+1] += r.v[i] / BIGMOD;
       r.v[i] %= BIGMOD;
     }
   }
   r.n();
   return r;
 }
예제 #6
0
pair<Bigint, int> divmod(Bigint a, int m) {
	long long r = 0;
	for (int i = a.len() - 1; i >= 0; i--) {
		r = r * BASE + a[i];
		a[i] = r / m;
		r %= m;
	}
	a.trim();
	return make_pair(a, (int) r);
}
예제 #7
0
Bigint operator * (Bigint a, int m) {
	long long r = 0;
	for (int i = 0; i < a.len(); i++) {
		r += (long long) a[i] * m;
		a[i] = r % BASE;
		r /= BASE;
	}
	while (r) a.data.push_back(r % BASE), r /= BASE;
	a.trim();
	return a;
}
예제 #8
0
 Bigint operator / (const Bigint &b) {
   Bigint r;
   r.resize(max(1, len()-b.len()+1));
   int oriS = s;
   Bigint b2 = b; // b2 = abs(b)
   s = b2.s = r.s = 1;
   for (int i=r.len()-1; i>=0; i--) {
     int d=0, u=BIGMOD-1;
     while(d<u) {
       int m = (d+u+1)>>1;
       r.v[i] = m;
       if((r*b2) > (*this)) u = m-1;
       else d = m;
     }
     r.v[i] = d;
   }
   s = oriS;
   r.s = s * b.s;
   r.n();
   return r;
 }
예제 #9
0
 Bigint operator - (const Bigint &b) const {
   if (s == -1) return -(-(*this)-(-b));
   if (b.s == -1) return (*this)+(-b);
   if ((*this) < b) return -(b-(*this));
   Bigint r;
   r.resize(len());
   for (int i=0; i<len(); i++) {
     r.v[i] += v[i];
     if (i < b.len()) r.v[i] -= b.v[i];
     if (r.v[i] < 0) {
       r.v[i] += BIGMOD;
       r.v[i+1]--;
     }
   }
   r.n();
   return r;
 }