/* *********************************************** Author :huriyang Created Time :2016年05月14日 星期六 13时29分27秒 File Name :bc4.cpp ************************************************ */ #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef unsigned long long ll; typedef pairP; #define mem(a,b) memset(a,b,sizeof(a)) // 高精度。 // 输入:scan,=。 // 输出:print,getNum。 // 运算:+,*,-,/,%,> 。 // 不支持负数。 class BigNum { public: const static int MaxL=1000; const static ll Mod=10000; const static int Dlen=4; int num[MaxL/Dlen+1],len; void changeStoNum(const char *); public: BigNum() { len=1; memset(num,0,sizeof(num)); } BigNum(int); BigNum(const char *s) { changeStoNum(s); } BigNum operator + (const BigNum &) const; BigNum operator - (const BigNum &) const; BigNum operator * (const BigNum &) const; BigNum operator / (const int) const; bool operator > (const BigNum &a) const; int operator % (const int m) const; bool scan(); void print(); }; BigNum::BigNum(int x) { memset(num,0,sizeof(num)); len=0; do { num[len++]=x-(x/Mod)*Mod; x/=Mod; }while(x); } void BigNum::changeStoNum(const char *x) { int L=strlen(x); int temp,tp; int p=0; memset(num,0,sizeof(num)); len=(L-1)/Dlen+1; for(int i=L-1;i>=0;i-=Dlen) { temp=0; tp=i-Dlen+1; if(tp<0) tp=0; for(int j=tp;j<=i;++j) temp=(temp<<3)+(temp<<1)+x[j]-'0'; num[p++]=temp; } while(num[len-1]==0 && len>1) --len; } bool BigNum::scan() { char x[MaxL]; if(scanf("%s",x)==-1) return 0; changeStoNum(x); } void BigNum::print() { printf("%d",num[len-1]); for(int i=len-2;i>=0;--i) printf("%04d",num[i]); } BigNum BigNum::operator + (const BigNum &b) const { BigNum ret(*this); int L=max(b.len,len); for(int i=0;i=Mod) { ++ret.num[i+1]; ret.num[i]-=Mod; } } ret.len=L; if(ret.num[L]) ++ret.len; return ret; } BigNum BigNum::operator - (const BigNum &b) const // 不支持负数,一定要是a>b。 { int L=this->len; int p; BigNum ret(*this); for(int i=0;ii) ret.num[p--]=Mod-1; ret.num[i]+=Mod-b.num[i]; } else ret.num[i]-=b.num[i]; } while(!ret.num[ret.len-1] && ret.len>1) --ret.len; return ret; } BigNum BigNum::operator * (const BigNum &b) const { BigNum ret; int temp; ret.len=len+b.len; for(int i=0;i=Mod) { temp=ret.num[i+j]/Mod; ret.num[i+j+1]+=temp; ret.num[i+j]-=temp*Mod; } } while(ret.num[ret.len-1]==0 && ret.len>1) --ret.len; return ret; } BigNum BigNum::operator / (const int b) const { BigNum ret; int down=0; for(int i=len-1;i>=0;--i) { ret.num[i]=(num[i]+down*Mod)/b; down=num[i]+down*Mod-ret.num[i]*b; } ret.len=len; while(ret.num[ret.len-1]==0 && ret.len>1) --ret.len; return ret; } int BigNum::operator % (const int b) const { int ret=0; for(int i=len-1;i>=0;--i) ret=((ret*Mod)%b+num[i])%b; return ret; } bool BigNum::operator > (const BigNum &b) const { if(len!=b.len) return len>b.len; for(int i=len-1;i>=0;--i) if(num[i]!=b.num[i]) return num[i]>b.num[i]; return 0; } BigNum _pow(int a,int b) { BigNum ret=1,base=a; while(b--) ret=ret*base; return ret; } const int N=205; BigNum dp[N]; void init() { // for(int i=0;i