Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
递推的方法做的,本来觉得可能超时,结果79ms,速度还可以#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N=100+10; struct Big { int s[6*N], len; void init() { memset(s,0,sizeof(s)); len=0; } }; Big arr[210]; int nnum; Big operator + (Big a, Big b) { Big c; c.init(); c.len=max(a.len,b.len); for(int i=1;i<=c.len;i++) { c.s[i]=c.s[i]+a.s[i]+b.s[i]; if(c.s[i]>=10) { c.s[i]-=10; c.s[i+1]++; } } if(c.s[c.len+1]) c.len++; return c; } Big operator * (Big a, Big b) { Big c; c.init(); for(int i=1;i<=a.len;i++) { int j; for(j=1,c.len=i-1;j<=b.len;j++) { //c.len=i-1; c.s[++c.len]=c.s[c.len]+a.s[i]*b.s[j]; } } for(int i=1;i<=c.len;i++) { if(c.s[i]>=10) c.len++; c.s[i+1]=c.s[i+1]+c.s[i]/10; c.s[i]=c.s[i]%10; } return c; } void work() { for(int i=0;i<=200;i++) arr[i].init(); arr[0].s[1]=1, arr[0].len=1; arr[1].s[1]=1, arr[1].len=1; for(int i=2;i<=101;i++) { for(int j=0;j<=i-1;j++) { arr[i]=arr[i]+arr[j]*arr[i-1-j]; } } } int main() { work(); while(~scanf("%d",&nnum) && nnum!=-1) { //printf("%d\n",arr[nnum].len); int i=arr[nnum].len; while(arr[nnum].s[i]==0) i--, arr[nnum].len--; for(int i=arr[nnum].len;i>=1;i--) printf("%d",arr[nnum].s[i]); printf("\n"); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator