• 个人简介

    c++高精度代码(基础比较/运算/位运算+gcd/lcm/pow):

    #include<iostream>
    #include<vector>
    #include<algorithm>
    #include<ctime>
    using namespace std;
    string jia(string s1, string s2){
    	string s3;
    	for(int i=0;i<max(s1.size(), s2.size());i++){
    		while(s3.size()<=i+1)s3.push_back('0');
    		if(i<s1.size()){
    			s3[i+1]=(s3[i]+s1[i]-0x60)/10+0x30;
    			s3[i]=(s3[i]+s1[i]-0x60)%10+0x30;
    		}
    		if(i<s2.size()){
    			s3[i+1]+=(s3[i]+s2[i]-0x60)/10;
    			s3[i]=(s3[i]+s2[i]-0x60)%10+0x30;
    		}
    	}
    	if(s3[s3.size()-1]=='0')s3.erase(s3.end()-1);
    	return s3;
    }
    string jian(string s1, string s2){
    	bool bo=0;
    	string s3(s1.size(), '0');
    	for(int i=0;i<s1.size();i++){
    		if(bo)s1[i]--;
    		if(s1[i]<s2[i]){
    			bo=1;
    			s1[i]+=10;
    		}else bo=0;
    		s3[i]=s1[i];
    		if(i<s2.size())s3[i]-=s2[i]-'0';
    	}
    	while(s3.size()>1&&s3[s3.size()-1]=='0')s3.erase(s3.end()-1);
    	return s3;
    }
    string chu2(string s1){
    	string s3(s1.size(), '0');
    	reverse(s1.begin(), s1.end());
    	for(int i=0;i<s1.size();i++){
    		s3[i]+=(s1[i]-'0')/2;
    		if(i+1<s1.size())s3[i+1]+=(s1[i]-'0')%2*5;
    	}
    	reverse(s3.begin(), s3.end());
    	if(s3.size()>1&&s3[s3.size()-1]=='0')s3.erase(s3.end()-1);
    	return s3;
    }
    class bignum{
    	vector<char>num;
    public:
    	
    	bignum()=default;
    	explicit bignum(long long n){
    		num.clear();
    		while(n){
    			num.push_back(n&1);
    			n>>=1;
    		}
    	}
    	explicit bignum(long n){
    		num.clear();
    		while(n){
    			num.push_back(n&1);
    			n>>=1;
    		}
    	}
    	explicit bignum(int n){
    		num.clear();
    		while(n){
    			num.push_back(n&1);
    			n>>=1;
    		}
    	}
    	explicit bignum(short n){
    		num.clear();
    		while(n){
    			num.push_back(n&1);
    			n>>=1;
    		}
    	}
    	explicit bignum(unsigned long long n){
    		num.clear();
    		while(n){
    			num.push_back(n&1);
    			n>>=1;
    		}
    	}
    	explicit bignum(unsigned long n){
    		num.clear();
    		while(n){
    			num.push_back(n&1);
    			n>>=1;
    		}
    	}
    	explicit bignum(unsigned int n){
    		num.clear();
    		while(n){
    			num.push_back(n&1);
    			n>>=1;
    		}
    	}
    	explicit bignum(unsigned short n){
    		num.clear();
    		while(n){
    			num.push_back(n&1);
    			n>>=1;
    		}
    	}
    	explicit bignum(bool n){
    		num.clear();
    		num.push_back(n);
    	}
    	
    	explicit operator long long(){
    		long long n=0;
    		for(int i=0;i<(*this).size();i++)n+=num[i]*(1<<i);
    		return n;
    	}
    	explicit operator long(){
    		long n=0;
    		for(int i=0;i<(*this).size();i++)n+=num[i]*(1<<i);
    		return n;
    	}
    	explicit operator int(){
    		int n=0;
    		for(int i=0;i<(*this).size();i++)n+=num[i]*(1<<i);
    		return n;
    	}
    	explicit operator short(){
    		short n=0;
    		for(int i=0;i<(*this).size();i++)n+=num[i]*(1<<i);
    		return n;
    	}
    	explicit operator unsigned long long(){
    		unsigned long long n=0;
    		for(int i=0;i<(*this).size();i++)n+=num[i]*(1<<i);
    		return n;
    	}
    	explicit operator unsigned long(){
    		unsigned long n=0;
    		for(int i=0;i<(*this).size();i++)n+=num[i]*(1<<i);
    		return n;
    	}
    	explicit operator unsigned int(){
    		unsigned int n=0;
    		for(int i=0;i<(*this).size();i++)n+=num[i]*(1<<i);
    		return n;
    	}
    	explicit operator unsigned short(){
    		unsigned short n=0;
    		for(int i=0;i<(*this).size();i++)n+=num[i]*(1<<i);
    		return n;
    	}
    	explicit operator bool(){
    		if((*this).size())return 1;
    		else return 0;
    	}
    	
    	friend istream& operator>>(istream &fin, bignum &b);
    	friend ostream& operator<<(ostream &fout, bignum b);
    	friend void qu0(bignum&);
    	int size(){
    		qu0(*this);
    		return (int)(*this).size();
    	}
    	
    	bignum operator=(bignum b){
    		num=b.num;
    		return *this;
    	}
    	bignum operator=(long long n){
    		num.clear();
    		while(n){
    			num.push_back(n&1);
    			n>>=1;
    		}
    		return *this;
    	}
    	bignum operator=(long n){
    		num.clear();
    		while(n){
    			num.push_back(n&1);
    			n>>=1;
    		}
    		return *this;
    	}
    	bignum operator=(int n){
    		num.clear();
    		while(n){
    			num.push_back(n&1);
    			n>>=1;
    		}
    		return *this;
    	}
    	bignum operator=(short n){
    		num.clear();
    		while(n){
    			num.push_back(n&1);
    			n>>=1;
    		}
    		return *this;
    	}
    	bignum operator=(unsigned long long n){
    		num.clear();
    		while(n){
    			num.push_back(n&1);
    			n>>=1;
    		}
    		return *this;
    	}
    	bignum operator=(unsigned long n){
    		num.clear();
    		while(n){
    			num.push_back(n&1);
    			n>>=1;
    		}
    		return *this;
    	}
    	bignum operator=(unsigned int n){
    		num.clear();
    		while(n){
    			num.push_back(n&1);
    			n>>=1;
    		}
    		return *this;
    	}
    	bignum operator=(unsigned short n){
    		num.clear();
    		while(n){
    			num.push_back(n&1);
    			n>>=1;
    		}
    		return *this;
    	}
    	bignum operator=(bool n){
    		n=(*this!=(bignum)0);
    		return *this;
    	}
    	
    	char& operator[](long long n){
    		while((*this).size()<=n)num.push_back(0);
    		return num[n];
    	}
    	char& operator[](long n){
    		while((*this).size()<=n)num.push_back(0);
    		return num[n];
    	}
    	char& operator[](int n){
    		while((*this).size()<=n)num.push_back(0);
    		return num[n];
    	}
    	char& operator[](short n){
    		while((*this).size()<=n)num.push_back(0);
    		return num[n];
    	}
    	char& operator[](unsigned long long n){
    		while((*this).size()<=n)num.push_back(0);
    		return num[n];
    	}
    	char& operator[](unsigned long n){
    		while((*this).size()<=n)num.push_back(0);
    		return num[n];
    	}
    	char& operator[](unsigned int n){
    		while((*this).size()<=n)num.push_back(0);
    		return num[n];
    	}
    	char& operator[](unsigned short n){
    		while((*this).size()<=n)num.push_back(0);
    		return num[n];
    	}
    	char& operator[](bool n){
    		if(n)return num[1];
    		return num[0];
    	}
    	char& operator[](bignum b){
    		int n(b);
    		return (*this)[n];
    	}
    	
    	bool operator<(bignum b)const{
    		bignum oa=*this, ob=b;
    		for(int i=max(oa.size(), ob.size())-1;i>=0;i--)if(oa[i]!=ob[i]){
    			if(oa[i])return false;
    			else return true;
    		}
    		return false;
    	}
    	bool operator<(long long b)const{
    		return *this<(bignum)b;
    	}
    	bool operator<(long b)const{
    		return *this<(bignum)b;
    	}
    	bool operator<(int b)const{
    		return *this<(bignum)b;
    	}
    	bool operator<(short b)const{
    		return *this<(bignum)b;
    	}
    	bool operator<(unsigned long long b)const{
    		return *this<(bignum)b;
    	}
    	bool operator<(unsigned long b)const{
    		return *this<(bignum)b;
    	}
    	bool operator<(unsigned int b)const{
    		return *this<(bignum)b;
    	}
    	bool operator<(unsigned short b)const{
    		return *this<(bignum)b;
    	}
    	bool operator<(bool b)const{
    		return *this<(bignum)b;
    	}
    	friend bool operator<(long long, bignum);
    	friend bool operator<(long, bignum);
    	friend bool operator<(int, bignum);
    	friend bool operator<(short, bignum);
    	friend bool operator<(unsigned long long, bignum);
    	friend bool operator<(unsigned long, bignum);
    	friend bool operator<(unsigned int, bignum);
    	friend bool operator<(unsigned short, bignum);
    	friend bool operator<(bool, bignum);
    	
    	bool operator>(bignum b)const{
    		bignum oa=*this, ob=b;
    		for(int i=max(oa.size(), ob.size())-1;i>=0;i--)if(oa[i]!=ob[i]){
    			if(oa[i])return true;
    			else return false;
    		}
    		return false;
    	}
    	bool operator>(long long b)const{
    		return *this>(bignum)b;
    	}
    	bool operator>(long b)const{
    		return *this>(bignum)b;
    	}
    	bool operator>(int b)const{
    		return *this>(bignum)b;
    	}
    	bool operator>(short b)const{
    		return *this>(bignum)b;
    	}
    	bool operator>(unsigned long long b)const{
    		return *this>(bignum)b;
    	}
    	bool operator>(unsigned long b)const{
    		return *this>(bignum)b;
    	}
    	bool operator>(unsigned int b)const{
    		return *this>(bignum)b;
    	}
    	bool operator>(unsigned short b)const{
    		return *this>(bignum)b;
    	}
    	bool operator>(bool b)const{
    		return *this>(bignum)b;
    	}
    	friend bool operator>(long long, bignum);
    	friend bool operator>(long, bignum);
    	friend bool operator>(int, bignum);
    	friend bool operator>(short, bignum);
    	friend bool operator>(unsigned long long, bignum);
    	friend bool operator>(unsigned long, bignum);
    	friend bool operator>(unsigned int, bignum);
    	friend bool operator>(unsigned short, bignum);
    	friend bool operator>(bool, bignum);
    	
    	bool operator==(bignum b)const{
    		bignum oa=*this, ob=b;
    		for(int i=0;i<max(oa.size(), ob.size());i++)if(oa[i]!=ob[i])return false;
    		return true;
    	}
    	bool operator==(long long b)const{
    		return *this==(bignum)b;
    	}
    	bool operator==(long b)const{
    		return *this==(bignum)b;
    	}
    	bool operator==(int b)const{
    		return *this==(bignum)b;
    	}
    	bool operator==(short b)const{
    		return *this==(bignum)b;
    	}
    	bool operator==(unsigned long long b)const{
    		return *this==(bignum)b;
    	}
    	bool operator==(unsigned long b)const{
    		return *this==(bignum)b;
    	}
    	bool operator==(unsigned int b)const{
    		return *this==(bignum)b;
    	}
    	bool operator==(unsigned short b)const{
    		return *this==(bignum)b;
    	}
    	bool operator==(bool b)const{
    		return *this==(bignum)b;
    	}
    	friend bool operator==(long long, bignum);
    	friend bool operator==(long, bignum);
    	friend bool operator==(int, bignum);
    	friend bool operator==(short, bignum);
    	friend bool operator==(unsigned long long, bignum);
    	friend bool operator==(unsigned long, bignum);
    	friend bool operator==(unsigned int, bignum);
    	friend bool operator==(unsigned short, bignum);
    	friend bool operator==(bool, bignum);
    	
    	bool operator!=(bignum b)const{
    		return !(*this==b);
    	}
    	bool operator!=(long long b)const{
    		return *this!=(bignum)b;
    	}
    	bool operator!=(long b)const{
    		return *this!=(bignum)b;
    	}
    	bool operator!=(int b)const{
    		return *this!=(bignum)b;
    	}
    	bool operator!=(short b)const{
    		return *this!=(bignum)b;
    	}
    	bool operator!=(unsigned long long b)const{
    		return *this!=(bignum)b;
    	}
    	bool operator!=(unsigned long b)const{
    		return *this!=(bignum)b;
    	}
    	bool operator!=(unsigned int b)const{
    		return *this!=(bignum)b;
    	}
    	bool operator!=(unsigned short b)const{
    		return *this!=(bignum)b;
    	}
    	bool operator!=(bool b)const{
    		return *this!=(bignum)b;
    	}
    	friend bool operator!=(long long, bignum);
    	friend bool operator!=(long, bignum);
    	friend bool operator!=(int, bignum);
    	friend bool operator!=(short, bignum);
    	friend bool operator!=(unsigned long long, bignum);
    	friend bool operator!=(unsigned long, bignum);
    	friend bool operator!=(unsigned int, bignum);
    	friend bool operator!=(unsigned short, bignum);
    	friend bool operator!=(bool, bignum);
    	
    	bool operator<=(bignum b)const{
    		return !(*this>b);
    	}
    	bool operator<=(long long b)const{
    		return *this<=(bignum)b;
    	}
    	bool operator<=(long b)const{
    		return *this<=(bignum)b;
    	}
    	bool operator<=(int b)const{
    		return *this<=(bignum)b;
    	}
    	bool operator<=(short b)const{
    		return *this<=(bignum)b;
    	}
    	bool operator<=(unsigned long long b)const{
    		return *this<=(bignum)b;
    	}
    	bool operator<=(unsigned long b)const{
    		return *this<=(bignum)b;
    	}
    	bool operator<=(unsigned int b)const{
    		return *this<=(bignum)b;
    	}
    	bool operator<=(unsigned short b)const{
    		return *this<=(bignum)b;
    	}
    	bool operator<=(bool b)const{
    		return *this<=(bignum)b;
    	}
    	friend bool operator<=(long long, bignum);
    	friend bool operator<=(long, bignum);
    	friend bool operator<=(int, bignum);
    	friend bool operator<=(short, bignum);
    	friend bool operator<=(unsigned long long, bignum);
    	friend bool operator<=(unsigned long, bignum);
    	friend bool operator<=(unsigned int, bignum);
    	friend bool operator<=(unsigned short, bignum);
    	friend bool operator<=(bool, bignum);
    	
    	bool operator>=(bignum b)const{
    		return !(*this<b);
    	}
    	bool operator>=(long long b)const{
    		return *this>=(bignum)b;
    	}
    	bool operator>=(long b)const{
    		return *this>=(bignum)b;
    	}
    	bool operator>=(int b)const{
    		return *this>=(bignum)b;
    	}
    	bool operator>=(short b)const{
    		return *this>=(bignum)b;
    	}
    	bool operator>=(unsigned long long b)const{
    		return *this>=(bignum)b;
    	}
    	bool operator>=(unsigned long b)const{
    		return *this>=(bignum)b;
    	}
    	bool operator>=(unsigned int b)const{
    		return *this>=(bignum)b;
    	}
    	bool operator>=(unsigned short b)const{
    		return *this>=(bignum)b;
    	}
    	bool operator>=(bool b)const{
    		return *this>=(bignum)b;
    	}
    	friend bool operator>=(long long, bignum);
    	friend bool operator>=(long, bignum);
    	friend bool operator>=(int, bignum);
    	friend bool operator>=(short, bignum);
    	friend bool operator>=(unsigned long long, bignum);
    	friend bool operator>=(unsigned long, bignum);
    	friend bool operator>=(unsigned int, bignum);
    	friend bool operator>=(unsigned short, bignum);
    	friend bool operator>=(bool, bignum);
    	
    	bignum operator+(bignum b){
    		bignum ans;
    		for(int i=0;i<max((*this).size(), b.size());i++){
    			if(i<(*this).size()&&num[i]==1){
    				if(ans[i]==1){
    					ans[i+1]=1;
    					ans[i]=0;
    				}else ans[i]=1;
    			}
    			if(i<b.size()&&b.num[i]==1){
    				if(ans[i]==1){
    					ans[i+1]=1;
    					ans[i]=0;
    				}else ans[i]=1;
    			}
    		}
    		qu0(ans);
    		return ans;
    	}
    	bignum operator+(long long b){
    		return *this+(bignum)b;
    	}
    	bignum operator+(long b){
    		return *this+(bignum)b;
    	}
    	bignum operator+(int b){
    		return *this+(bignum)b;
    	}
    	bignum operator+(short b){
    		return *this+(bignum)b;
    	}
    	bignum operator+(unsigned long long b){
    		return *this+(bignum)b;
    	}
    	bignum operator+(unsigned long b){
    		return *this+(bignum)b;
    	}
    	bignum operator+(unsigned int b){
    		return *this+(bignum)b;
    	}
    	bignum operator+(unsigned short b){
    		return *this+(bignum)b;
    	}
    	bignum operator+(bool b){
    		return *this+(bignum)b;
    	}
    	friend bignum operator+(long long, bignum);
    	friend bignum operator+(long, bignum);
    	friend bignum operator+(int, bignum);
    	friend bignum operator+(short, bignum);
    	friend bignum operator+(unsigned long long, bignum);
    	friend bignum operator+(unsigned long, bignum);
    	friend bignum operator+(unsigned int, bignum);
    	friend bignum operator+(unsigned short, bignum);
    	friend bignum operator+(bool, bignum);
    	
    	bignum operator-(bignum b){
    		bignum ans, ob=b, oa=*this;
    		for(int i=0;i<oa.size();i++){
    			if(oa[i]<ob[i]){
    				oa[i+1]--;
    				oa[i]+=2;
    			}
    			ans[i]=oa[i]-ob[i];
    		}
    		qu0(ans);
    		return ans;
    	}
    	bignum operator-(long long b){
    		return *this-(bignum)b;
    	}
    	bignum operator-(long b){
    		return *this-(bignum)b;
    	}
    	bignum operator-(int b){
    		return *this-(bignum)b;
    	}
    	bignum operator-(short b){
    		return *this-(bignum)b;
    	}
    	bignum operator-(unsigned long long b){
    		return *this-(bignum)b;
    	}
    	bignum operator-(unsigned long b){
    		return *this-(bignum)b;
    	}
    	bignum operator-(unsigned int b){
    		return *this-(bignum)b;
    	}
    	bignum operator-(unsigned short b){
    		return *this-(bignum)b;
    	}
    	bignum operator-(bool b){
    		return *this-(bignum)b;
    	}
    	friend bignum operator-(long long, bignum);
    	friend bignum operator-(long, bignum);
    	friend bignum operator-(int, bignum);
    	friend bignum operator-(short, bignum);
    	friend bignum operator-(unsigned long long, bignum);
    	friend bignum operator-(unsigned long, bignum);
    	friend bignum operator-(unsigned int, bignum);
    	friend bignum operator-(unsigned short, bignum);
    	friend bignum operator-(bool, bignum);
    	
    	bignum operator+=(bignum b){
    		return *this=*this+b;
    	}
    	bignum operator+=(long long b){
    		return *this+=(bignum)b;
    	}
    	bignum operator+=(long b){
    		return *this+=(bignum)b;
    	}
    	bignum operator+=(int b){
    		return *this+=(bignum)b;
    	}
    	bignum operator+=(short b){
    		return *this+=(bignum)b;
    	}
    	bignum operator+=(unsigned long long b){
    		return *this+=(bignum)b;
    	}
    	bignum operator+=(unsigned long b){
    		return *this+=(bignum)b;
    	}
    	bignum operator+=(unsigned int b){
    		return *this+=(bignum)b;
    	}
    	bignum operator+=(unsigned short b){
    		return *this+=(bignum)b;
    	}
    	bignum operator+=(bool b){
    		return *this+=(bignum)b;
    	}
    	friend bignum operator+=(long long, bignum);
    	friend bignum operator+=(long, bignum);
    	friend bignum operator+=(int, bignum);
    	friend bignum operator+=(short, bignum);
    	friend bignum operator+=(unsigned long long, bignum);
    	friend bignum operator+=(unsigned long, bignum);
    	friend bignum operator+=(unsigned int, bignum);
    	friend bignum operator+=(unsigned short, bignum);
    	friend bignum operator+=(bool, bignum);
    	
    	bignum operator-=(bignum b){
    		return *this=*this-b;
    	}
    	bignum operator-=(long long b){
    		return *this-=(bignum)b;
    	}
    	bignum operator-=(long b){
    		return *this-=(bignum)b;
    	}
    	bignum operator-=(int b){
    		return *this-=(bignum)b;
    	}
    	bignum operator-=(short b){
    		return *this-=(bignum)b;
    	}
    	bignum operator-=(unsigned long long b){
    		return *this-=(bignum)b;
    	}
    	bignum operator-=(unsigned long b){
    		return *this-=(bignum)b;
    	}
    	bignum operator-=(unsigned int b){
    		return *this-=(bignum)b;
    	}
    	bignum operator-=(unsigned short b){
    		return *this-=(bignum)b;
    	}
    	bignum operator-=(bool b){
    		return *this-=(bignum)b;
    	}
    	friend bignum operator-=(long long, bignum);
    	friend bignum operator-=(long, bignum);
    	friend bignum operator-=(int, bignum);
    	friend bignum operator-=(short, bignum);
    	friend bignum operator-=(unsigned long long, bignum);
    	friend bignum operator-=(unsigned long, bignum);
    	friend bignum operator-=(unsigned int, bignum);
    	friend bignum operator-=(unsigned short, bignum);
    	friend bignum operator-=(bool, bignum);
    	
    	bignum operator++(){
    		*this+=1;
    		return *this;
    	}
    	bignum operator++(int){
    		*this+=1;
    		return *this-1;
    	}
    	
    	bignum operator--(){
    		*this-=1;
    		return *this;
    	}
    	bignum operator--(int){
    		*this-=1;
    		return *this+1;
    	}
    	bignum operator|(bignum b){
    		bignum ans=b;
    		for(int i=0;i<(*this).size();i++)ans[i]=ans[i]||num[i];
    		qu0(ans);
    		return ans;
    	}
    	bignum operator|(long long b){
    		return *this|(bignum)b;
    	}
    	bignum operator|(long b){
    		return *this|(bignum)b;
    	}
    	bignum operator|(int b){
    		return *this|(bignum)b;
    	}
    	bignum operator|(short b){
    		return *this|(bignum)b;
    	}
    	bignum operator|(unsigned long long b){
    		return *this|(bignum)b;
    	}
    	bignum operator|(unsigned long b){
    		return *this|(bignum)b;
    	}
    	bignum operator|(unsigned int b){
    		return *this|(bignum)b;
    	}
    	bignum operator|(unsigned short b){
    		return *this|(bignum)b;
    	}
    	bignum operator|(bool b){
    		return *this|(bignum)b;
    	}
    	friend bignum operator|(long long, bignum);
    	friend bignum operator|(long, bignum);
    	friend bignum operator|(int, bignum);
    	friend bignum operator|(short, bignum);
    	friend bignum operator|(unsigned long long, bignum);
    	friend bignum operator|(unsigned long, bignum);
    	friend bignum operator|(unsigned int, bignum);
    	friend bignum operator|(unsigned short, bignum);
    	friend bignum operator|(bool, bignum);
    	
    	bignum operator&(bignum b){
    		bignum ans=b;
    		for(int i=0;i<(*this).size();i++)ans[i]=ans[i]&&num[i];
    		qu0(ans);
    		return ans;
    	}
    	bignum operator&(long long b){
    		return *this&(bignum)b;
    	}
    	bignum operator&(long b){
    		return *this&(bignum)b;
    	}
    	bignum operator&(int b){
    		return *this&(bignum)b;
    	}
    	bignum operator&(short b){
    		return *this&(bignum)b;
    	}
    	bignum operator&(unsigned long long b){
    		return *this&(bignum)b;
    	}
    	bignum operator&(unsigned long b){
    		return *this&(bignum)b;
    	}
    	bignum operator&(unsigned int b){
    		return *this&(bignum)b;
    	}
    	bignum operator&(unsigned short b){
    		return *this&(bignum)b;
    	}
    	bignum operator&(bool b){
    		return *this&(bignum)b;
    	}
    	friend bignum operator&(long long, bignum);
    	friend bignum operator&(long, bignum);
    	friend bignum operator&(int, bignum);
    	friend bignum operator&(short, bignum);
    	friend bignum operator&(unsigned long long, bignum);
    	friend bignum operator&(unsigned long, bignum);
    	friend bignum operator&(unsigned int, bignum);
    	friend bignum operator&(unsigned short, bignum);
    	friend bignum operator&(bool, bignum);
    	
    	bignum operator^(bignum b){
    		bignum ans=b;
    		for(int i=0;i<(*this).size();i++)ans[i]=(ans[i]!=num[i]);
    		qu0(ans);
    		return ans;
    	}
    	bignum operator^(long long b){
    		return *this^(bignum)b;
    	}
    	bignum operator^(long b){
    		return *this^(bignum)b;
    	}
    	bignum operator^(int b){
    		return *this^(bignum)b;
    	}
    	bignum operator^(short b){
    		return *this^(bignum)b;
    	}
    	bignum operator^(unsigned long long b){
    		return *this^(bignum)b;
    	}
    	bignum operator^(unsigned long b){
    		return *this^(bignum)b;
    	}
    	bignum operator^(unsigned int b){
    		return *this^(bignum)b;
    	}
    	bignum operator^(unsigned short b){
    		return *this^(bignum)b;
    	}
    	bignum operator^(bool b){
    		return *this^(bignum)b;
    	}
    	friend bignum operator^(long long, bignum);
    	friend bignum operator^(long, bignum);
    	friend bignum operator^(int, bignum);
    	friend bignum operator^(short, bignum);
    	friend bignum operator^(unsigned long long, bignum);
    	friend bignum operator^(unsigned long, bignum);
    	friend bignum operator^(unsigned int, bignum);
    	friend bignum operator^(unsigned short, bignum);
    	friend bignum operator^(bool, bignum);
    	
    	bignum operator<<(bignum n){
    		bignum ans;
    		for(int i=0;i<n;i++)ans[i]=0;
    		for(int i=0;i<(*this).size();i++)ans[i+n]=(*this)[i];
    		qu0(ans);
    		return ans;
    	}
    	bignum operator<<(long long b){
    		return *this<<(bignum)b;
    	}
    	bignum operator<<(long b){
    		return *this<<(bignum)b;
    	}
    	bignum operator<<(int b){
    		return *this<<(bignum)b;
    	}
    	bignum operator<<(short b){
    		return *this<<(bignum)b;
    	}
    	bignum operator<<(unsigned long long b){
    		return *this<<(bignum)b;
    	}
    	bignum operator<<(unsigned long b){
    		return *this<<(bignum)b;
    	}
    	bignum operator<<(unsigned int b){
    		return *this<<(bignum)b;
    	}
    	bignum operator<<(unsigned short b){
    		return *this<<(bignum)b;
    	}
    	bignum operator<<(bool b){
    		return *this<<(bignum)b;
    	}
    	friend bignum operator<<(long long, bignum);
    	friend bignum operator<<(long, bignum);
    	friend bignum operator<<(int, bignum);
    	friend bignum operator<<(short, bignum);
    	friend bignum operator<<(unsigned long long, bignum);
    	friend bignum operator<<(unsigned long, bignum);
    	friend bignum operator<<(unsigned int, bignum);
    	friend bignum operator<<(unsigned short, bignum);
    	friend bignum operator<<(bool, bignum);
    	
    	bignum operator>>(bignum n){
    		bignum on=*this, ans;
    		for(int i(n);i<(*this).size();i++)ans[i-n]=on[i];
    		qu0(ans);
    		return ans;
    	}
    	bignum operator>>(long long b){
    		return *this>>(bignum)b;
    	}
    	bignum operator>>(long b){
    		return *this>>(bignum)b;
    	}
    	bignum operator>>(int b){
    		return *this>>(bignum)b;
    	}
    	bignum operator>>(short b){
    		return *this>>(bignum)b;
    	}
    	bignum operator>>(unsigned long long b){
    		return *this>>(bignum)b;
    	}
    	bignum operator>>(unsigned long b){
    		return *this>>(bignum)b;
    	}
    	bignum operator>>(unsigned int b){
    		return *this>>(bignum)b;
    	}
    	bignum operator>>(unsigned short b){
    		return *this>>(bignum)b;
    	}
    	bignum operator>>(bool b){
    		return *this>>(bignum)b;
    	}
    	friend bignum operator>>(long long, bignum);
    	friend bignum operator>>(long, bignum);
    	friend bignum operator>>(int, bignum);
    	friend bignum operator>>(short, bignum);
    	friend bignum operator>>(unsigned long long, bignum);
    	friend bignum operator>>(unsigned long, bignum);
    	friend bignum operator>>(unsigned int, bignum);
    	friend bignum operator>>(unsigned short, bignum);
    	friend bignum operator>>(bool, bignum);
    	
    	bignum operator~(){
    		bignum ans;
    		for(int i=0;i<(*this).size();i++)ans[i]=!(*this)[i];
    		return ans;
    	}
    	
    	bignum operator|=(bignum b){
    		return *this=*this|b;
    	}
    	bignum operator|=(long long b){
    		return *this|=(bignum)b;
    	}
    	bignum operator|=(long b){
    		return *this|=(bignum)b;
    	}
    	bignum operator|=(int b){
    		return *this|=(bignum)b;
    	}
    	bignum operator|=(short b){
    		return *this|=(bignum)b;
    	}
    	bignum operator|=(unsigned long long b){
    		return *this|=(bignum)b;
    	}
    	bignum operator|=(unsigned long b){
    		return *this|=(bignum)b;
    	}
    	bignum operator|=(unsigned int b){
    		return *this|=(bignum)b;
    	}
    	bignum operator|=(unsigned short b){
    		return *this|=(bignum)b;
    	}
    	bignum operator|=(bool b){
    		return *this|=(bignum)b;
    	}
    	friend bignum operator|=(long long, bignum);
    	friend bignum operator|=(long, bignum);
    	friend bignum operator|=(int, bignum);
    	friend bignum operator|=(short, bignum);
    	friend bignum operator|=(unsigned long long, bignum);
    	friend bignum operator|=(unsigned long, bignum);
    	friend bignum operator|=(unsigned int, bignum);
    	friend bignum operator|=(unsigned short, bignum);
    	friend bignum operator|=(bool, bignum);
    	
    	bignum operator&=(bignum b){
    		return *this=*this&b;
    	}
    	bignum operator&=(long long b){
    		return *this&=(bignum)b;
    	}
    	bignum operator&=(long b){
    		return *this&=(bignum)b;
    	}
    	bignum operator&=(int b){
    		return *this&=(bignum)b;
    	}
    	bignum operator&=(short b){
    		return *this&=(bignum)b;
    	}
    	bignum operator&=(unsigned long long b){
    		return *this&=(bignum)b;
    	}
    	bignum operator&=(unsigned long b){
    		return *this&=(bignum)b;
    	}
    	bignum operator&=(unsigned int b){
    		return *this&=(bignum)b;
    	}
    	bignum operator&=(unsigned short b){
    		return *this&=(bignum)b;
    	}
    	bignum operator&=(bool b){
    		return *this&=(bignum)b;
    	}
    	friend bignum operator&=(long long, bignum);
    	friend bignum operator&=(long, bignum);
    	friend bignum operator&=(int, bignum);
    	friend bignum operator&=(short, bignum);
    	friend bignum operator&=(unsigned long long, bignum);
    	friend bignum operator&=(unsigned long, bignum);
    	friend bignum operator&=(unsigned int, bignum);
    	friend bignum operator&=(unsigned short, bignum);
    	friend bignum operator&=(bool, bignum);
    	
    	bignum operator^=(bignum b){
    		return *this=*this^b;
    	}
    	bignum operator^=(long long b){
    		return *this^=(bignum)b;
    	}
    	bignum operator^=(long b){
    		return *this^=(bignum)b;
    	}
    	bignum operator^=(int b){
    		return *this^=(bignum)b;
    	}
    	bignum operator^=(short b){
    		return *this^=(bignum)b;
    	}
    	bignum operator^=(unsigned long long b){
    		return *this^=(bignum)b;
    	}
    	bignum operator^=(unsigned long b){
    		return *this^=(bignum)b;
    	}
    	bignum operator^=(unsigned int b){
    		return *this^=(bignum)b;
    	}
    	bignum operator^=(unsigned short b){
    		return *this^=(bignum)b;
    	}
    	bignum operator^=(bool b){
    		return *this^=(bignum)b;
    	}
    	friend bignum operator^=(long long, bignum);
    	friend bignum operator^=(long, bignum);
    	friend bignum operator^=(int, bignum);
    	friend bignum operator^=(short, bignum);
    	friend bignum operator^=(unsigned long long, bignum);
    	friend bignum operator^=(unsigned long, bignum);
    	friend bignum operator^=(unsigned int, bignum);
    	friend bignum operator^=(unsigned short, bignum);
    	friend bignum operator^=(bool, bignum);
    	
    	bignum operator<<=(bignum b){
    		return *this=*this<<b;
    	}
    	bignum operator<<=(long long b){
    		return *this<<=(bignum)b;
    	}
    	bignum operator<<=(long b){
    		return *this<<=(bignum)b;
    	}
    	bignum operator<<=(int b){
    		return *this<<=(bignum)b;
    	}
    	bignum operator<<=(short b){
    		return *this<<=(bignum)b;
    	}
    	bignum operator<<=(unsigned long long b){
    		return *this<<=(bignum)b;
    	}
    	bignum operator<<=(unsigned long b){
    		return *this<<=(bignum)b;
    	}
    	bignum operator<<=(unsigned int b){
    		return *this<<=(bignum)b;
    	}
    	bignum operator<<=(unsigned short b){
    		return *this<<=(bignum)b;
    	}
    	bignum operator<<=(bool b){
    		return *this<<=(bignum)b;
    	}
    	friend bignum operator<<=(long long, bignum);
    	friend bignum operator<<=(long, bignum);
    	friend bignum operator<<=(int, bignum);
    	friend bignum operator<<=(short, bignum);
    	friend bignum operator<<=(unsigned long long, bignum);
    	friend bignum operator<<=(unsigned long, bignum);
    	friend bignum operator<<=(unsigned int, bignum);
    	friend bignum operator<<=(unsigned short, bignum);
    	friend bignum operator<<=(bool, bignum);
    	
    	bignum operator>>=(bignum b){
    		return *this=*this>>b;
    	}
    	bignum operator>>=(long long b){
    		return *this>>=(bignum)b;
    	}
    	bignum operator>>=(long b){
    		return *this>>=(bignum)b;
    	}
    	bignum operator>>=(int b){
    		return *this>>=(bignum)b;
    	}
    	bignum operator>>=(short b){
    		return *this>>=(bignum)b;
    	}
    	bignum operator>>=(unsigned long long b){
    		return *this>>=(bignum)b;
    	}
    	bignum operator>>=(unsigned long b){
    		return *this>>=(bignum)b;
    	}
    	bignum operator>>=(unsigned int b){
    		return *this>>=(bignum)b;
    	}
    	bignum operator>>=(unsigned short b){
    		return *this>>=(bignum)b;
    	}
    	bignum operator>>=(bool b){
    		return *this>>=(bignum)b;
    	}
    	friend bignum operator>>=(long long, bignum);
    	friend bignum operator>>=(long, bignum);
    	friend bignum operator>>=(int, bignum);
    	friend bignum operator>>=(short, bignum);
    	friend bignum operator>>=(unsigned long long, bignum);
    	friend bignum operator>>=(unsigned long, bignum);
    	friend bignum operator>>=(unsigned int, bignum);
    	friend bignum operator>>=(unsigned short, bignum);
    	friend bignum operator>>=(bool, bignum);
    	
    	
    	bignum operator*(bignum b){
    		bignum ans;
    		for(int i=0;i<(*this).size();i++)if(num[i])ans+=b<<i;
    		qu0(ans);
    		return ans;
    	}
    	bignum operator*(long long b){
    		return *this*(bignum)b;
    	}
    	bignum operator*(long b){
    		return *this*(bignum)b;
    	}
    	bignum operator*(int b){
    		return *this*(bignum)b;
    	}
    	bignum operator*(short b){
    		return *this*(bignum)b;
    	}
    	bignum operator*(unsigned long long b){
    		return *this*(bignum)b;
    	}
    	bignum operator*(unsigned long b){
    		return *this*(bignum)b;
    	}
    	bignum operator*(unsigned int b){
    		return *this*(bignum)b;
    	}
    	bignum operator*(unsigned short b){
    		return *this*(bignum)b;
    	}
    	bignum operator*(bool b){
    		return *this*(bignum)b;
    	}
    	friend bignum operator*(long long, bignum);
    	friend bignum operator*(long, bignum);
    	friend bignum operator*(int, bignum);
    	friend bignum operator*(short, bignum);
    	friend bignum operator*(unsigned long long, bignum);
    	friend bignum operator*(unsigned long, bignum);
    	friend bignum operator*(unsigned int, bignum);
    	friend bignum operator*(unsigned short, bignum);
    	friend bignum operator*(bool, bignum);
    	
    	bignum operator/(bignum b){
    		int i=0;
    		bignum oa=*this, ob=b, ans;
    		for(i;ob<=oa;i++)ob<<=1;
    		if(!i)return(bignum)0;
    		i--;
    		ob>>=1;
    		for(i;i>=0;i--){
    			if(ob<=oa){
    				ans[i]=1;
    				oa-=ob;
    			}
    			ob>>=1;
    		}
    		qu0(ans);
    		return ans;
    	}
    	bignum operator/(long long b){
    		return *this/(bignum)b;
    	}
    	bignum operator/(long b){
    		return *this/(bignum)b;
    	}
    	bignum operator/(int b){
    		return *this/(bignum)b;
    	}
    	bignum operator/(short b){
    		return *this/(bignum)b;
    	}
    	bignum operator/(unsigned long long b){
    		return *this/(bignum)b;
    	}
    	bignum operator/(unsigned long b){
    		return *this/(bignum)b;
    	}
    	bignum operator/(unsigned int b){
    		return *this/(bignum)b;
    	}
    	bignum operator/(unsigned short b){
    		return *this/(bignum)b;
    	}
    	bignum operator/(bool b){
    		return *this/(bignum)b;
    	}
    	friend bignum operator/(long long, bignum);
    	friend bignum operator/(long, bignum);
    	friend bignum operator/(int, bignum);
    	friend bignum operator/(short, bignum);
    	friend bignum operator/(unsigned long long, bignum);
    	friend bignum operator/(unsigned long, bignum);
    	friend bignum operator/(unsigned int, bignum);
    	friend bignum operator/(unsigned short, bignum);
    	friend bignum operator/(bool, bignum);
    	
    	bignum operator%(bignum b){
    		bignum ans=*this-*this/b*b;
    		qu0(ans);
    		return ans;
    	}
    	bignum operator%(long long b){
    		return *this%(bignum)b;
    	}
    	bignum operator%(long b){
    		return *this%(bignum)b;
    	}
    	bignum operator%(int b){
    		return *this%(bignum)b;
    	}
    	bignum operator%(short b){
    		return *this%(bignum)b;
    	}
    	bignum operator%(unsigned long long b){
    		return *this%(bignum)b;
    	}
    	bignum operator%(unsigned long b){
    		return *this%(bignum)b;
    	}
    	bignum operator%(unsigned int b){
    		return *this%(bignum)b;
    	}
    	bignum operator%(unsigned short b){
    		return *this%(bignum)b;
    	}
    	bignum operator%(bool b){
    		return *this%(bignum)b;
    	}
    	friend bignum operator%(long long, bignum);
    	friend bignum operator%(long, bignum);
    	friend bignum operator%(int, bignum);
    	friend bignum operator%(short, bignum);
    	friend bignum operator%(unsigned long long, bignum);
    	friend bignum operator%(unsigned long, bignum);
    	friend bignum operator%(unsigned int, bignum);
    	friend bignum operator%(unsigned short, bignum);
    	friend bignum operator%(bool, bignum);
    	
    	bignum operator*=(bignum b){
    		return *this=*this*b;
    	}
    	bignum operator*=(long long b){
    		return *this*=(bignum)b;
    	}
    	bignum operator*=(long b){
    		return *this*=(bignum)b;
    	}
    	bignum operator*=(int b){
    		return *this*=(bignum)b;
    	}
    	bignum operator*=(short b){
    		return *this*=(bignum)b;
    	}
    	bignum operator*=(unsigned long long b){
    		return *this*=(bignum)b;
    	}
    	bignum operator*=(unsigned long b){
    		return *this*=(bignum)b;
    	}
    	bignum operator*=(unsigned int b){
    		return *this*=(bignum)b;
    	}
    	bignum operator*=(unsigned short b){
    		return *this*=(bignum)b;
    	}
    	bignum operator*=(bool b){
    		return *this*=(bignum)b;
    	}
    	friend bignum operator*=(long long, bignum);
    	friend bignum operator*=(long, bignum);
    	friend bignum operator*=(int, bignum);
    	friend bignum operator*=(short, bignum);
    	friend bignum operator*=(unsigned long long, bignum);
    	friend bignum operator*=(unsigned long, bignum);
    	friend bignum operator*=(unsigned int, bignum);
    	friend bignum operator*=(unsigned short, bignum);
    	friend bignum operator*=(bool, bignum);
    	
    	bignum operator/=(bignum b){
    		return *this=*this/b;
    	}
    	bignum operator/=(long long b){
    		return *this/=(bignum)b;
    	}
    	bignum operator/=(long b){
    		return *this/=(bignum)b;
    	}
    	bignum operator/=(int b){
    		return *this/=(bignum)b;
    	}
    	bignum operator/=(short b){
    		return *this/=(bignum)b;
    	}
    	bignum operator/=(unsigned long long b){
    		return *this/=(bignum)b;
    	}
    	bignum operator/=(unsigned long b){
    		return *this/=(bignum)b;
    	}
    	bignum operator/=(unsigned int b){
    		return *this/=(bignum)b;
    	}
    	bignum operator/=(unsigned short b){
    		return *this/=(bignum)b;
    	}
    	bignum operator/=(bool b){
    		return *this/=(bignum)b;
    	}
    	friend bignum operator/=(long long, bignum);
    	friend bignum operator/=(long, bignum);
    	friend bignum operator/=(int, bignum);
    	friend bignum operator/=(short, bignum);
    	friend bignum operator/=(unsigned long long, bignum);
    	friend bignum operator/=(unsigned long, bignum);
    	friend bignum operator/=(unsigned int, bignum);
    	friend bignum operator/=(unsigned short, bignum);
    	friend bignum operator/=(bool, bignum);
    	
    	bignum operator%=(bignum b){
    		return *this=*this%b;
    	}
    	bignum operator%=(long long b){
    		return *this%=(bignum)b;
    	}
    	bignum operator%=(long b){
    		return *this%=(bignum)b;
    	}
    	bignum operator%=(int b){
    		return *this%=(bignum)b;
    	}
    	bignum operator%=(short b){
    		return *this%=(bignum)b;
    	}
    	bignum operator%=(unsigned long long b){
    		return *this%=(bignum)b;
    	}
    	bignum operator%=(unsigned long b){
    		return *this%=(bignum)b;
    	}
    	bignum operator%=(unsigned int b){
    		return *this%=(bignum)b;
    	}
    	bignum operator%=(unsigned short b){
    		return *this%=(bignum)b;
    	}
    	bignum operator%=(bool b){
    		return *this%=(bignum)b;
    	}
    	friend bignum operator%=(long long, bignum);
    	friend bignum operator%=(long, bignum);
    	friend bignum operator%=(int, bignum);
    	friend bignum operator%=(short, bignum);
    	friend bignum operator%=(unsigned long long, bignum);
    	friend bignum operator%=(unsigned long, bignum);
    	friend bignum operator%=(unsigned int, bignum);
    	friend bignum operator%=(unsigned short, bignum);
    	friend bignum operator%=(bool, bignum);
    	
    };
    istream& operator>>(istream& fin, bignum &b){
    	b.num.clear();
    	string s;
    	fin >> s;
    //	time_t be=clock(), en;
    	reverse(s.begin(), s.end());
    	while(s!="0"){
    		b.num.push_back(s[0]%2);
    		s=chu2(s);
    	}
    //	en=clock();
    //	cout << "\n[input] : " << (int)(en-be) << "ms\n[input] : " << s << "\n\n";
    	return fin;
    }
    ostream& operator<<(ostream &fout, bignum b){
    //	time_t be=clock(), en;
    	string s="0", k="1";
    	for(auto x:b.num){
    		if(x==1)s=jia(s, k);
    		k=jia(k, k);
    	}
    	reverse(s.begin(), s.end());
    //	en=clock();
    //	cout << "\n[output] : " << (int)(en-be) << "ms\n[output] : " << s << "\n\n";
    	fout << s;
    	return fout;
    }
    void qu0(bignum& b){
    	while(b.size()>1&&!b[b.size()-1])b.num.erase(b.num.end()-1);
    }
    
    bool operator<(long long n, bignum b){
    	return (bignum)n<b;
    }
    bool operator<(long n, bignum b){
    	return (bignum)n<b;
    }
    bool operator<(int n, bignum b){
    	return (bignum)n<b;
    }
    bool operator<(short n, bignum b){
    	return (bignum)n<b;
    }
    bool operator<(unsigned long long n, bignum b){
    	return (bignum)n<b;
    }
    bool operator<(unsigned long n, bignum b){
    	return (bignum)n<b;
    }
    bool operator<(unsigned int n, bignum b){
    	return (bignum)n<b;
    }
    bool operator<(unsigned short n, bignum b){
    	return (bignum)n<b;
    }
    bool operator<(bool n, bignum b){
    	return (bignum)n<b;
    }
    
    bool operator>(long long n, bignum b){
    	return (bignum)n>b;
    }
    bool operator>(long n, bignum b){
    	return (bignum)n>b;
    }
    bool operator>(int n, bignum b){
    	return (bignum)n>b;
    }
    bool operator>(short n, bignum b){
    	return (bignum)n>b;
    }
    bool operator>(unsigned long long n, bignum b){
    	return (bignum)n>b;
    }
    bool operator>(unsigned long n, bignum b){
    	return (bignum)n>b;
    }
    bool operator>(unsigned int n, bignum b){
    	return (bignum)n>b;
    }
    bool operator>(unsigned short n, bignum b){
    	return (bignum)n>b;
    }
    bool operator>(bool n, bignum b){
    	return (bignum)n>b;
    }
    
    bool operator==(long long n, bignum b){
    	return (bignum)n==b;
    }
    bool operator==(long n, bignum b){
    	return (bignum)n==b;
    }
    bool operator==(int n, bignum b){
    	return (bignum)n==b;
    }
    bool operator==(short n, bignum b){
    	return (bignum)n==b;
    } 
    bool operator==(unsigned long long n, bignum b){
    	return (bignum)n==b;
    }
    bool operator==(unsigned long n, bignum b){
    	return (bignum)n==b;
    }
    bool operator==(unsigned int n, bignum b){
    	return (bignum)n==b;
    }
    bool operator==(unsigned short n, bignum b){
    	return (bignum)n==b;
    }
    bool operator==(bool n, bignum b){
    	return (bignum)n==b;
    }
    
    bool operator!=(long long n, bignum b){
    	return (bignum)n!=b;
    }
    bool operator!=(long n, bignum b){
    	return (bignum)n!=b;
    }
    bool operator!=(int n, bignum b){
    	return (bignum)n!=b;
    }
    bool operator!=(short n, bignum b){
    	return (bignum)n!=b;
    } 
    bool operator!=(unsigned long long n, bignum b){
    	return (bignum)n!=b;
    }
    bool operator!=(unsigned long n, bignum b){
    	return (bignum)n!=b;
    }
    bool operator!=(unsigned int n, bignum b){
    	return (bignum)n!=b;
    }
    bool operator!=(unsigned short n, bignum b){
    	return (bignum)n!=b;
    }
    bool operator!=(bool n, bignum b){
    	return (bignum)n!=b;
    }
    
    bool operator<=(long long n, bignum b){
    	return (bignum)n<=b;
    }
    bool operator<=(long n, bignum b){
    	return (bignum)n<=b;
    }
    bool operator<=(int n, bignum b){
    	return (bignum)n<=b;
    }
    bool operator<=(short n, bignum b){
    	return (bignum)n<=b;
    } 
    bool operator<=(unsigned long long n, bignum b){
    	return (bignum)n<=b;
    }
    bool operator<=(unsigned long n, bignum b){
    	return (bignum)n<=b;
    }
    bool operator<=(unsigned int n, bignum b){
    	return (bignum)n<=b;
    }
    bool operator<=(unsigned short n, bignum b){
    	return (bignum)n<=b;
    }
    bool operator<=(bool n, bignum b){
    	return (bignum)n<=b;
    }
    
    bool operator>=(long long n, bignum b){
    	return (bignum)n>=b;
    }
    bool operator>=(long n, bignum b){
    	return (bignum)n>=b;
    }
    bool operator>=(int n, bignum b){
    	return (bignum)n>=b;
    }
    bool operator>=(short n, bignum b){
    	return (bignum)n>=b;
    }
    bool operator>=(unsigned long long n, bignum b){
    	return (bignum)n>=b;
    }
    bool operator>=(unsigned long n, bignum b){
    	return (bignum)n>=b;
    }
    bool operator>=(unsigned int n, bignum b){
    	return (bignum)n>=b;
    }
    bool operator>=(unsigned short n, bignum b){
    	return (bignum)n>=b;
    }
    bool operator>=(bool n, bignum b){
    	return (bignum)n>=b;
    }
    
    bignum operator+(long long n, bignum b){
    	return (bignum)n+b;
    }
    bignum operator+(long n, bignum b){
    	return (bignum)n+b;
    }
    bignum operator+(int n, bignum b){
    	return (bignum)n+b;
    }
    bignum operator+(short n, bignum b){
    	return (bignum)n+b;
    }
    bignum operator+(unsigned long long n, bignum b){
    	return (bignum)n+b;
    }
    bignum operator+(unsigned long n, bignum b){
    	return (bignum)n+b;
    }
    bignum operator+(unsigned int n, bignum b){
    	return (bignum)n+b;
    }
    bignum operator+(unsigned short n, bignum b){
    	return (bignum)n+b;
    }
    bignum operator+(bool n, bignum b){
    	return (bignum)n+b;
    }
    
    bignum operator-(long long n, bignum b){
    	return (bignum)n-b;
    }
    bignum operator-(long n, bignum b){
    	return (bignum)n-b;
    }
    bignum operator-(int n, bignum b){
    	return (bignum)n-b;
    }
    bignum operator-(short n, bignum b){
    	return (bignum)n-b;
    }
    bignum operator-(unsigned long long n, bignum b){
    	return (bignum)n-b;
    }
    bignum operator-(unsigned long n, bignum b){
    	return (bignum)n-b;
    }
    bignum operator-(unsigned int n, bignum b){
    	return (bignum)n-b;
    }
    bignum operator-(unsigned short n, bignum b){
    	return (bignum)n-b;
    }
    bignum operator-(bool n, bignum b){
    	return (bignum)n-b;
    }
    
    bignum operator+=(long long n, bignum b){
    	return (bignum)n+=b;
    }
    bignum operator+=(long n, bignum b){
    	return (bignum)n+=b;
    }
    bignum operator+=(int n, bignum b){
    	return (bignum)n+=b;
    }
    bignum operator+=(short n, bignum b){
    	return (bignum)n+=b;
    }
    bignum operator+=(unsigned long long n, bignum b){
    	return (bignum)n+=b;
    }
    bignum operator+=(unsigned long n, bignum b){
    	return (bignum)n+=b;
    }
    bignum operator+=(unsigned int n, bignum b){
    	return (bignum)n+=b;
    }
    bignum operator+=(unsigned short n, bignum b){
    	return (bignum)n+=b;
    }
    bignum operator+=(bool n, bignum b){
    	return (bignum)n+=b;
    }
    
    bignum operator-=(long long n, bignum b){
    	return (bignum)n-=b;
    }
    bignum operator-=(long n, bignum b){
    	return (bignum)n-=b;
    }
    bignum operator-=(int n, bignum b){
    	return (bignum)n-=b;
    }
    bignum operator-=(short n, bignum b){
    	return (bignum)n-=b;
    }
    bignum operator-=(unsigned long long n, bignum b){
    	return (bignum)n-=b;
    }
    bignum operator-=(unsigned long n, bignum b){
    	return (bignum)n-=b;
    }
    bignum operator-=(unsigned int n, bignum b){
    	return (bignum)n-=b;
    }
    bignum operator-=(unsigned short n, bignum b){
    	return (bignum)n-=b;
    }
    bignum operator-=(bool n, bignum b){
    	return (bignum)n-=b;
    }
    
    bignum operator|(long long n, bignum b){
    	return (bignum)n|b;
    }
    bignum operator|(long n, bignum b){
    	return (bignum)n|b;
    }
    bignum operator|(int n, bignum b){
    	return (bignum)n|b;
    }
    bignum operator|(short n, bignum b){
    	return (bignum)n|b;
    }
    bignum operator|(unsigned long long n, bignum b){
    	return (bignum)n|b;
    }
    bignum operator|(unsigned long n, bignum b){
    	return (bignum)n|b;
    }
    bignum operator|(unsigned int n, bignum b){
    	return (bignum)n|b;
    }
    bignum operator|(unsigned short n, bignum b){
    	return (bignum)n|b;
    }
    bignum operator|(bool n, bignum b){
    	return (bignum)n|b;
    }
    
    bignum operator&(long long n, bignum b){
    	return (bignum)n&b;
    }
    bignum operator&(long n, bignum b){
    	return (bignum)n&b;
    }
    bignum operator&(int n, bignum b){
    	return (bignum)n&b;
    }
    bignum operator&(short n, bignum b){
    	return (bignum)n&b;
    }
    bignum operator&(unsigned long long n, bignum b){
    	return (bignum)n&b;
    }
    bignum operator&(unsigned long n, bignum b){
    	return (bignum)n&b;
    }
    bignum operator&(unsigned int n, bignum b){
    	return (bignum)n&b;
    }
    bignum operator&(unsigned short n, bignum b){
    	return (bignum)n&b;
    }
    bignum operator&(bool n, bignum b){
    	return (bignum)n&b;
    }
    
    bignum operator^(long long n, bignum b){
    	return (bignum)n^b;
    }
    bignum operator^(long n, bignum b){
    	return (bignum)n^b;
    }
    bignum operator^(int n, bignum b){
    	return (bignum)n^b;
    }
    bignum operator^(short n, bignum b){
    	return (bignum)n^b;
    }
    bignum operator^(unsigned long long n, bignum b){
    	return (bignum)n^b;
    }
    bignum operator^(unsigned long n, bignum b){
    	return (bignum)n^b;
    }
    bignum operator^(unsigned int n, bignum b){
    	return (bignum)n^b;
    }
    bignum operator^(unsigned short n, bignum b){
    	return (bignum)n^b;
    }
    bignum operator^(bool n, bignum b){
    	return (bignum)n^b;
    }
    
    bignum operator<<(long long n, bignum b){
    	return (bignum)n<<b;
    }
    bignum operator<<(long n, bignum b){
    	return (bignum)n<<b;
    }
    bignum operator<<(int n, bignum b){
    	return (bignum)n<<b;
    }
    bignum operator<<(short n, bignum b){
    	return (bignum)n<<b;
    }
    bignum operator<<(unsigned long long n, bignum b){
    	return (bignum)n<<b;
    }
    bignum operator<<(unsigned long n, bignum b){
    	return (bignum)n<<b;
    }
    bignum operator<<(unsigned int n, bignum b){
    	return (bignum)n<<b;
    }
    bignum operator<<(unsigned short n, bignum b){
    	return (bignum)n<<b;
    }
    bignum operator<<(bool n, bignum b){
    	return (bignum)n<<b;
    }
    
    bignum operator>>(long long n, bignum b){
    	return (bignum)n>>b;
    }
    bignum operator>>(long n, bignum b){
    	return (bignum)n>>b;
    }
    bignum operator>>(int n, bignum b){
    	return (bignum)n>>b;
    }
    bignum operator>>(short n, bignum b){
    	return (bignum)n>>b;
    }
    bignum operator>>(unsigned long long n, bignum b){
    	return (bignum)n>>b;
    }
    bignum operator>>(unsigned long n, bignum b){
    	return (bignum)n>>b;
    }
    bignum operator>>(unsigned int n, bignum b){
    	return (bignum)n>>b;
    }
    bignum operator>>(unsigned short n, bignum b){
    	return (bignum)n>>b;
    }
    bignum operator>>(bool n, bignum b){
    	return (bignum)n>>b;
    }
    
    bignum operator|=(long long n, bignum b){
    	return (bignum)n|=b;
    }
    bignum operator|=(long n, bignum b){
    	return (bignum)n|=b;
    }
    bignum operator|=(int n, bignum b){
    	return (bignum)n|=b;
    }
    bignum operator|=(short n, bignum b){
    	return (bignum)n|=b;
    }
    bignum operator|=(unsigned long long n, bignum b){
    	return (bignum)n|=b;
    }
    bignum operator|=(unsigned long n, bignum b){
    	return (bignum)n|=b;
    }
    bignum operator|=(unsigned int n, bignum b){
    	return (bignum)n|=b;
    }
    bignum operator|=(unsigned short n, bignum b){
    	return (bignum)n|=b;
    }
    bignum operator|=(bool n, bignum b){
    	return (bignum)n|=b;
    }
    
    bignum operator&=(long long n, bignum b){
    	return (bignum)n&=b;
    }
    bignum operator&=(long n, bignum b){
    	return (bignum)n&=b;
    }
    bignum operator&=(int n, bignum b){
    	return (bignum)n&=b;
    }
    bignum operator&=(short n, bignum b){
    	return (bignum)n&=b;
    }
    bignum operator&=(unsigned long long n, bignum b){
    	return (bignum)n&=b;
    }
    bignum operator&=(unsigned long n, bignum b){
    	return (bignum)n&=b;
    }
    bignum operator&=(unsigned int n, bignum b){
    	return (bignum)n&=b;
    }
    bignum operator&=(unsigned short n, bignum b){
    	return (bignum)n&=b;
    }
    bignum operator&=(bool n, bignum b){
    	return (bignum)n&=b;
    }
    
    bignum operator^=(long long n, bignum b){
    	return (bignum)n^=b;
    }
    bignum operator^=(long n, bignum b){
    	return (bignum)n^=b;
    }
    bignum operator^=(int n, bignum b){
    	return (bignum)n^=b;
    }
    bignum operator^=(short n, bignum b){
    	return (bignum)n^=b;
    }
    bignum operator^=(unsigned long long n, bignum b){
    	return (bignum)n^=b;
    }
    bignum operator^=(unsigned long n, bignum b){
    	return (bignum)n^=b;
    }
    bignum operator^=(unsigned int n, bignum b){
    	return (bignum)n^=b;
    }
    bignum operator^=(unsigned short n, bignum b){
    	return (bignum)n^=b;
    }
    bignum operator^=(bool n, bignum b){
    	return (bignum)n^=b;
    }
    
    bignum operator<<=(long long n, bignum b){
    	return (bignum)n<<=b;
    }
    bignum operator<<=(long n, bignum b){
    	return (bignum)n<<=b;
    }
    bignum operator<<=(int n, bignum b){
    	return (bignum)n<<=b;
    }
    bignum operator<<=(short n, bignum b){
    	return (bignum)n<<=b;
    }
    bignum operator<<=(unsigned long long n, bignum b){
    	return (bignum)n<<=b;
    }
    bignum operator<<=(unsigned long n, bignum b){
    	return (bignum)n<<=b;
    }
    bignum operator<<=(unsigned int n, bignum b){
    	return (bignum)n<<=b;
    }
    bignum operator<<=(unsigned short n, bignum b){
    	return (bignum)n<<=b;
    }
    bignum operator<<=(bool n, bignum b){
    	return (bignum)n<<=b;
    }
    
    bignum operator>>=(long long n, bignum b){
    	return (bignum)n>>=b;
    }
    bignum operator>>=(long n, bignum b){
    	return (bignum)n>>=b;
    }
    bignum operator>>=(int n, bignum b){
    	return (bignum)n>>=b;
    }
    bignum operator>>=(short n, bignum b){
    	return (bignum)n>>=b;
    }
    bignum operator>>=(unsigned long long n, bignum b){
    	return (bignum)n>>=b;
    }
    bignum operator>>=(unsigned long n, bignum b){
    	return (bignum)n>>=b;
    }
    bignum operator>>=(unsigned int n, bignum b){
    	return (bignum)n>>=b;
    }
    bignum operator>>=(unsigned short n, bignum b){
    	return (bignum)n>>=b;
    }
    bignum operator>>=(bool n, bignum b){
    	return (bignum)n>>=b;
    }
    
    bignum operator*(long long n, bignum b){
    	return (bignum)n*b;
    }
    bignum operator*(long n, bignum b){
    	return (bignum)n*b;
    }
    bignum operator*(int n, bignum b){
    	return (bignum)n*b;
    }
    bignum operator*(short n, bignum b){
    	return (bignum)n*b;
    }
    bignum operator*(unsigned long long n, bignum b){
    	return (bignum)n*b;
    }
    bignum operator*(unsigned long n, bignum b){
    	return (bignum)n*b;
    }
    bignum operator*(unsigned int n, bignum b){
    	return (bignum)n*b;
    }
    bignum operator*(unsigned short n, bignum b){
    	return (bignum)n*b;
    }
    bignum operator*(bool n, bignum b){
    	return (bignum)n*b;
    }
    
    bignum operator/(long long n, bignum b){
    	return (bignum)n/b;
    }
    bignum operator/(long n, bignum b){
    	return (bignum)n/b;
    }
    bignum operator/(int n, bignum b){
    	return (bignum)n/b;
    }
    bignum operator/(short n, bignum b){
    	return (bignum)n/b;
    }
    bignum operator/(unsigned long long n, bignum b){
    	return (bignum)n/b;
    }
    bignum operator/(unsigned long n, bignum b){
    	return (bignum)n/b;
    }
    bignum operator/(unsigned int n, bignum b){
    	return (bignum)n/b;
    }
    bignum operator/(unsigned short n, bignum b){
    	return (bignum)n/b;
    }
    bignum operator/(bool n, bignum b){
    	return (bignum)n/b;
    }
    
    bignum operator%(long long n, bignum b){
    	return (bignum)n%b;
    }
    bignum operator%(long n, bignum b){
    	return (bignum)n%b;
    }
    bignum operator%(int n, bignum b){
    	return (bignum)n%b;
    }
    bignum operator%(short n, bignum b){
    	return (bignum)n%b;
    }
    bignum operator%(unsigned long long n, bignum b){
    	return (bignum)n%b;
    }
    bignum operator%(unsigned long n, bignum b){
    	return (bignum)n%b;
    }
    bignum operator%(unsigned int n, bignum b){
    	return (bignum)n%b;
    }
    bignum operator%(unsigned short n, bignum b){
    	return (bignum)n%b;
    }
    bignum operator%(bool n, bignum b){
    	return (bignum)n%b;
    }
    
    bignum operator*=(long long n, bignum b){
    	return (bignum)n*=b;
    }
    bignum operator*=(long n, bignum b){
    	return (bignum)n*=b;
    }
    bignum operator*=(int n, bignum b){
    	return (bignum)n*=b;
    }
    bignum operator*=(short n, bignum b){
    	return (bignum)n*=b;
    }
    bignum operator*=(unsigned long long n, bignum b){
    	return (bignum)n*=b;
    }
    bignum operator*=(unsigned long n, bignum b){
    	return (bignum)n*=b;
    }
    bignum operator*=(unsigned int n, bignum b){
    	return (bignum)n*=b;
    }
    bignum operator*=(unsigned short n, bignum b){
    	return (bignum)n*=b;
    }
    bignum operator*=(bool n, bignum b){
    	return (bignum)n*=b;
    }
    
    bignum operator/=(long long n, bignum b){
    	return (bignum)n/=b;
    }
    bignum operator/=(long n, bignum b){
    	return (bignum)n/=b;
    }
    bignum operator/=(int n, bignum b){
    	return (bignum)n/=b;
    }
    bignum operator/=(short n, bignum b){
    	return (bignum)n/=b;
    }
    bignum operator/=(unsigned long long n, bignum b){
    	return (bignum)n/=b;
    }
    bignum operator/=(unsigned long n, bignum b){
    	return (bignum)n/=b;
    }
    bignum operator/=(unsigned int n, bignum b){
    	return (bignum)n/=b;
    }
    bignum operator/=(unsigned short n, bignum b){
    	return (bignum)n/=b;
    }
    bignum operator/=(bool n, bignum b){
    	return (bignum)n/=b;
    }
    
    bignum operator%=(long long n, bignum b){
    	return (bignum)n%=b;
    }
    bignum operator%=(long n, bignum b){
    	return (bignum)n%=b;
    }
    bignum operator%=(int n, bignum b){
    	return (bignum)n%=b;
    }
    bignum operator%=(short n, bignum b){
    	return (bignum)n%=b;
    }
    bignum operator%=(unsigned long long n, bignum b){
    	return (bignum)n%=b;
    }
    bignum operator%=(unsigned long n, bignum b){
    	return (bignum)n%=b;
    }
    bignum operator%=(unsigned int n, bignum b){
    	return (bignum)n%=b;
    }
    bignum operator%=(unsigned short n, bignum b){
    	return (bignum)n%=b;
    }
    bignum operator%=(bool n, bignum b){
    	return (bignum)n%=b;
    }
    
    bignum gcd(bignum n, bignum b){
    	if(n<b)swap(n, b);
    	bignum num=n%b;
    	while(num!=0){
    		n=b;
    		b=num;
    		num=n%b;
    	}
    	return b;
    }
    bignum gcd(bignum n, long long b){
    	return gcd(n, (bignum)b);
    }
    bignum gcd(bignum n, long b){
    	return gcd(n, (bignum)b);
    }
    bignum gcd(bignum n, int b){
    	return gcd(n, (bignum)b);
    }
    bignum gcd(bignum n, short b){
    	return gcd(n, (bignum)b);
    }
    bignum gcd(bignum n, unsigned long long b){
    	return gcd(n, (bignum)b);
    }
    bignum gcd(bignum n, unsigned long b){
    	return gcd(n, (bignum)b);
    }
    bignum gcd(bignum n, unsigned int b){
    	return gcd(n, (bignum)b);
    }
    bignum gcd(bignum n, unsigned short b){
    	return gcd(n, (bignum)b);
    }
    bignum gcd(bignum n, bool b){
    	return gcd(n, (bignum)b);
    }
    bignum gcd(long long n, bignum b){
    	return gcd((bignum)n, b);
    }
    bignum gcd(long n, bignum b){
    	return gcd((bignum)n, b);
    }
    bignum gcd(int n, bignum b){
    	return gcd((bignum)n, b);
    }
    bignum gcd(short n, bignum b){
    	return gcd((bignum)n, b);
    }
    bignum gcd(unsigned long long n, bignum b){
    	return gcd((bignum)n, b);
    }
    bignum gcd(unsigned long n, bignum b){
    	return gcd((bignum)n, b);
    }
    bignum gcd(unsigned int n, bignum b){
    	return gcd((bignum)n, b);
    }
    bignum gcd(unsigned short n, bignum b){
    	return gcd((bignum)n, b);
    }
    bignum gcd(bool n, bignum b){
    	return gcd((bignum)n, b);
    }
    
    bignum lcm(bignum n, bignum b){
    	return n/gcd(n, b)*b;
    }
    bignum lcm(bignum n, long long b){
    	return lcm(n, (bignum)b);
    }
    bignum lcm(bignum n, long b){
    	return lcm(n, (bignum)b);
    }
    bignum lcm(bignum n, int b){
    	return lcm(n, (bignum)b);
    }
    bignum lcm(bignum n, short b){
    	return lcm(n, (bignum)b);
    }
    bignum lcm(bignum n, unsigned long long b){
    	return lcm(n, (bignum)b);
    }
    bignum lcm(bignum n, unsigned long b){
    	return lcm(n, (bignum)b);
    }
    bignum lcm(bignum n, unsigned int b){
    	return lcm(n, (bignum)b);
    }
    bignum lcm(bignum n, unsigned short b){
    	return lcm(n, (bignum)b);
    }
    bignum lcm(bignum n, bool b){
    	return lcm(n, (bignum)b);
    }
    bignum lcm(long long n, bignum b){
    	return lcm((bignum)n, b);
    }
    bignum lcm(long n, bignum b){
    	return lcm((bignum)n, b);
    }
    bignum lcm(int n, bignum b){
    	return lcm((bignum)n, b);
    }
    bignum lcm(short n, bignum b){
    	return lcm((bignum)n, b);
    }
    bignum lcm(unsigned long long n, bignum b){
    	return lcm((bignum)n, b);
    }
    bignum lcm(unsigned long n, bignum b){
    	return lcm((bignum)n, b);
    }
    bignum lcm(unsigned int n, bignum b){
    	return lcm((bignum)n, b);
    }
    bignum lcm(unsigned short n, bignum b){
    	return lcm((bignum)n, b);
    }
    bignum lcm(bool n, bignum b){
    	return lcm((bignum)n, b);
    }
    
    bignum pow(bignum n, bignum b){
    	bignum ans(1), mul=n, ob=b;
    	for(bignum i(0);(ob>>i)>0;i++){
    		if(((ob>>i)&1)==1)ans*=mul;
    		mul*=mul;
    	}
    	return ans;
    }
    bignum pow(bignum n, long long b){
    	return pow(n, (bignum)b);
    }
    bignum pow(bignum n, long b){
    	return pow(n, (bignum)b);
    }
    bignum pow(bignum n, int b){
    	return pow(n, (bignum)b);
    }
    bignum pow(bignum n, short b){
    	return pow(n, (bignum)b);
    }
    bignum pow(bignum n, unsigned long long b){
    	return pow(n, (bignum)b);
    }
    bignum pow(bignum n, unsigned long b){
    	return pow(n, (bignum)b);
    }
    bignum pow(bignum n, unsigned int b){
    	return pow(n, (bignum)b);
    }
    bignum pow(bignum n, unsigned short b){
    	return pow(n, (bignum)b);
    }
    bignum pow(bignum n, bool b){
    	return pow(n, (bignum)b);
    }
    bignum pow(long long n, bignum b){
    	return pow((bignum)n, b);
    }
    bignum pow(long n, bignum b){
    	return pow((bignum)n, b);
    }
    bignum pow(int n, bignum b){
    	return pow((bignum)n, b);
    }
    bignum pow(short n, bignum b){
    	return pow((bignum)n, b);
    }
    bignum pow(unsigned long long n, bignum b){
    	return pow((bignum)n, b);
    }
    bignum pow(unsigned long n, bignum b){
    	return pow((bignum)n, b);
    }
    bignum pow(unsigned int n, bignum b){
    	return pow((bignum)n, b);
    }
    bignum pow(unsigned short n, bignum b){
    	return pow((bignum)n, b);
    }
    bignum pow(bool n, bignum b){
    	return pow((bignum)n, b);
    }
    
  • 通过的题目

  • 最近活动

  • 最近编写的题解

    This person is lazy and didn't write any solutions.

题目标签

系统测试
1