您的位置:首页 > 其它

pku2084 Game of Connections

2013-05-28 16:48 162 查看
http://poj.org/problem?id=2084

组合数学,Catalan数,高精度

#include <stdio.h>
#include <string>
#include <iostream>

using namespace std;

const int ten[4] = {1, 10, 100, 1000};
const int max1=1000;

struct BigNumber{
int d[max1];
BigNumber(string s)
{
int len = s.size();
d[0] = (len-1)/4+1;
int i, j, k;
for(i=1; i<max1; ++i) d[i] =0;
for(i=len-1; i>=0; --i)
{
j = (len-i-1)/4+1;
k = (len-i-1)%4;
d[j]+=ten[k]*(s[i]-'0');
}
while(d[0]>1 && d[d[0]]==0) --d[0];
}
BigNumber()
{
*this = BigNumber(string("0"));
}
string toString()
{
string s("");
int i, j, temp;
for(i=3; i>=1; --i) if(d[d[0]]>=ten[i]) break;
temp = d[d[0]];
for(j=i; j>=0; --j)
{
s = s+(char)(temp/ten[j]+'0');
temp %= ten[j];
}
for(i=d[0]-1; i>0; --i)
{
temp = d[i];
for(j=3; j>=0; --j)
{
s = s+(char)(temp/ten[j]+'0');
temp %= ten[j];
}
}
return s;
}
}zero("0"), d, temp, mid1[15];

BigNumber operator + (const BigNumber &a, const BigNumber &b){
BigNumber c;
c.d[0] = max(a.d[0], b.d[0]);
int i, x=0;
for(i=1; i<=c.d[0]; ++i)
{
x = a.d[i]+b.d[i] +x;
c.d[i]=x%10000;
x/=10000;
}
while(x!=0)
{
c.d[++c.d[0]] = x%10000;
x/=10000;
}
return c;
}

BigNumber operator *(const BigNumber &a, const BigNumber &b){
BigNumber c;
c.d[0] = a.d[0] + b.d[0];
int i, j, x;
for(i=1; i<=a.d[0]; ++i)
{
x= 0;
for(j=1; j<=b.d[0]; ++j)
{
x = a.d[i]*b.d[j]+x+c.d[i+j-1];
c.d[i+j-1] = x%10000;
x /= 10000;
}
c.d[i+b.d[0]] = x;
}
while((c.d[0]>1) && (c.d[c.d[0]]==0)) --c.d[0];
return c;
}

int main()
{
BigNumber one("1"), h[103];
int i, j, n;
h[0] = one;
h[1] = one;
for(n=2; n<=100; n++)
{
BigNumber sum("0");
for(i=0; i<=n-1; i++)
{
sum = sum + (h[i] * h[n-i-1]);
}
h
= sum;
}
while(cin>>i, i+1)
{
cout<<h[i].toString()<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: