Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 7136 | Accepted: 3625 |
Description
Input
Output
Sample Input
2 3 -1
Sample Output
2 5
Source
我是巩固一下卡特兰数,顺便存一下高精度模板的。
代码:
/* *********************************************** Author :rabbit Created Time :2014/3/27 13:57:20 File Name :7.cpp ************************************************ */ #pragma comment(linker, "/STACK:102400000,102400000") #include <stdio.h> #include <iostream> #include <algorithm> #include <sstream> #include <stdlib.h> #include <string.h> #include <limits.h> #include <string> #include <time.h> #include <math.h> #include <queue> #include <stack> #include <set> #include <map> using namespace std; #define INF 0x3f3f3f3f #define eps 1e-8 #define pi acos(-1.0) typedef long long ll; const int maxn=9999; const int maxsize=2020; const int dlen=4; class BigNum{ private: int a[1000],len; public: BigNum(){ len=1;memset(a,0,sizeof(a)); } BigNum(const int b){ int c,d=b; len=0; memset(a,0,sizeof(a)); while(d>maxn){ c=d-(d/(maxn+1))*(maxn+1); d=d/(maxn+1); a[len++]=c; } a[len++]=d; } BigNum(const char *s){ int t,k,index,L,i; memset(a,0,sizeof(a)); L=strlen(s); len=L/dlen; if(L%dlen)len++; index=0; for(int i=L-1;i>=0;i-=dlen){ t=0; k=i-dlen+1; if(k<0)k=0; for(int j=k;j<=i;j++) t=t*10+s[j]-‘0‘; a[index++]=t; } } BigNum(const BigNum &T):len(T.len){ int i; memset(a,0,sizeof(a)); for(int i=0;i<len;i++) a[i]=T.a[i]; } BigNum operator = (const BigNum &n){ int i; len=n.len; memset(a,0,sizeof(a)); for(int i=0;i<len;i++) a[i]=n.a[i]; return *this; } BigNum operator + (const BigNum &T) const{ BigNum t(*this); int i,big; big=T.len>len?T.len:len; for(int i=0;i<big;i++){ t.a[i]+=T.a[i]; if(t.a[i]>maxn){ t.a[i+1]++; t.a[i]-=maxn+1; } } if(t.a[big])t.len=big+1; else t.len=big; return t; } BigNum operator - (const BigNum &T) const{ int i,j,big; bool flag; BigNum t1,t2; if(*this>T){ t1=*this; t2=T; flag=0; } else{ t1=T; t2=*this; flag=1; } big=t1.len; for(i=0;i<big;i++){ if(t1.a[i]<t2.a[i]){ j=i+1; while(t1.a[j]==0)j++; t1.a[j--]--; while(j>i)t1.a[j--]+=maxn; t1.a[i]+=maxn+1-t1.a[i]; } else t1.a[i]-=t2.a[i]; } t1.len=big; while(t1.a[len-1]==0&&t1.len>1){ t1.len--; big--; } if(flag)t1.a[big-1]=0-t1.a[big-1]; return t1; } BigNum operator * (const BigNum &T) const{ BigNum ret; int i,j,up; int temp,temp1; for( i=0;i<len;i++){ up=0; for( j=0;j<T.len;j++){ temp=a[i]*T.a[j]+ret.a[i+j]+up; if(temp>maxn){ temp1=temp-temp/(maxn+1)*(maxn+1); up=temp/(maxn+1); ret.a[i+j]=temp1; } else{ up=0; ret.a[i+j]=temp; } } if(up)ret.a[i+j]=up; } ret.len=i+j; while(ret.a[ret.len-1]==0&&ret.len>1)ret.len--; return ret; } BigNum operator / (const int &b) const{ BigNum ret; int i,down=0; for(int i=len-1;i>=0;i--){ ret.a[i]=(a[i]+down*(maxn+1))/b; down=a[i]+down*(maxn+1)-ret.a[i]*b; } ret.len=len; while(ret.a[ret.len-1]==0&&ret.len>1)ret.len--; return ret; } BigNum operator % (const int &b) const{ int i,d=0; for(int i=len-1;i>=0;i--) d=((d*(maxn+1))%b+a[i])%b; return d; } BigNum operator ^ (const int &n) const{ BigNum t,ret(1); int i; if(n<0)exit(-1); if(n==0)return 1; if(n==1)return *this; int m=n; while(m>1){ t=*this; for( i=1;(i<<1)<=m;i<<=1)t=t*t; m-=i; ret=ret*t; if(m==1)ret=ret*(*this); } return ret; } bool operator > (const BigNum &T) const{ int ln; if(len>T.len)return true; else if(len==T.len){ ln=len-1; while(a[ln]==T.a[ln]&&ln>=0)ln--; if(ln>=0&&a[ln]>T.a[ln])return true; else return false; } else return false; } bool operator > (const int &t) const{ BigNum b(t); return *this>b; } void print(){ int i; printf("%d",a[len-1]); for(int i=len-2;i>=0;i--)printf("%04d",a[i]); puts(""); } }; int main() { //freopen("data.in","r",stdin); //freopen("data.out","w",stdout); BigNum f[110]; f[0]=BigNum(1); //f[0].print(); for(int i=1;i<=100;i++) f[i]=f[i-1]*BigNum(4*i-2)/(i+1); int n; while(cin>>n&&n>0)f[n].print(); return 0; }
POJ 2084 卡特兰数+高精度模板,布布扣,bubuko.com
原文:http://blog.csdn.net/xianxingwuguan1/article/details/22295253