#ifndef BIG_INT_HPP #define BIG_INT_HPP #include "semi_bitset.hpp" #include template class BigInt{ private: int signum = 1; semi_bitset= 1000> bits; public: inline BigInt(){ } inline BigInt(int o){ if(o < 0){signum = -1;o *= -1;} bits.data[bits.length() - 1] = (unsigned int)o; } inline BigInt(unsigned int o){ bits.data[bits.length() - 1] = o; } inline BigInt(long long o){ if(o < 0){signum = -1;o *= -1;} bits.data[bits.length() - 1] = (lower_half); bits.data[bits.length() - 2] = (o >> 32); } inline BigInt(unsigned long long o){ bits.data[bits.length() - 1] = (o & lower_half); bits.data[bits.length() - 2] = (o >> 32); } template BigInt add(const BigInt& o)const{ static_assert(size == osize); BigInt ret; uint64_t carry = 0; for(size_t i = size - 1;i >= 0;i--){ uint64_t res = (*this)[i] + o[i] + carry; carry = (res >> 32); ret[i] = res & lower_half; if(i == 0)break; } return ret; } BigInt div(unsigned int o)const{ uint64_t carry = 0; BigInt ret; for(size_t i = 0;i < size;i++){ lldiv_t dm = std::div((unsigned long long int)((carry << 32) + (*this)[i]),(unsigned long long int)o); carry = dm.rem; std::cout << " " << dm.rem << " "; ret[i] = dm.quot; } return ret; } unsigned int mod(unsigned int o)const{ uint64_t carry = 0; for(size_t i = 0;i < size;i++){ lldiv_t dm = std::div((long long int)((carry << 32) + (*this)[i]),(unsigned long long int)o); carry = dm.rem; } return (unsigned int)(carry & lower_half); } std::uint64_t& operator[](size_t i){ return bits.data[i]; } const std::uint64_t& operator[](size_t i)const{ return bits.data[i]; } template inline friend stream& operator<<(stream& s, const BigInt& o){ for(size_t i = 0;i < o.bits.length();i++) s << std::bitset<32>((uint32_t)(o.bits.data[i] & lower_half)); return s; } }; #endif