/*20141102 hanting*/
/*因為WA不知道錯哪,所以另外又寫了一個版本,
後來發現存大數用10000會溢位,1000就AC了*/
/*遞迴+重載運算*/
#include <iostream>
#include <vector>
using namespace std;
struct BigNum
{
vector<int> num;
void operator+=(BigNum n)
{
int R=max(n.num.size(),num.size());
num.resize(R+1);
n.num.resize(R+1);
vector<int> ans(1);
for(int i=0;i<R;i++)
{
ans[i]+=num[i]+n.num[i];
ans.push_back(ans[i]/1000);
ans[i]%=1000;
}
if(!ans[R]) ans.pop_back();
num=ans;
}
BigNum operator*(BigNum n)
{
BigNum ans;
ans.num.resize(num.size()+n.num.size());
for(int i=0;i<num.size();i++)
{
for(int j=0;j<n.num.size();j++)
{
ans.num[i+j]+=num[i]*n.num[j];
}
}
for(int i=1;i<ans.num.size();i++)
{
ans.num[i]+=ans.num[i-1]/1000;
ans.num[i-1]%=1000;
}
for(int i=ans.num.size()-1;i>0;i--)
{
if(ans.num[i]==0) ans.num.pop_back();
else break;
}
return ans;
}
void operator*=(int n)
{
vector<int> ans(1);
for(int i=0;i<num.size();i++)
{
ans[i]+=num[i]*2;
ans.push_back(ans[i]/1000);
ans[i]%=1000;
}
if(!ans[ans.size()-1]) ans.pop_back();
num=ans;
}
friend ostream& operator<<(ostream& out, BigNum& n)
{
int first=n.num.size()-1;
out<<n.num[first];
for(int i=first-1;i>=0;i--)
{
if(n.num[i]<100) out<<0;
if(n.num[i]<10) out<<0;
out<<n.num[i];
}
return out;
}
};
BigNum store[1005];
BigNum tree(int n)
{
if(store[n].num.size()) return store[n];
else
{
for(int i=0;i<n/2;i++)
{
store[n]+=tree(i)*tree(n-i-1);
}
store[n]*=2;
if(n%2==1)store[n]+=tree(n/2)*tree(n/2);
return store[n];
}
}
int main()
{
store[0].num.push_back(1);
store[1].num.push_back(1);
store[2].num.push_back(2);
store[3].num.push_back(5);
int N;
while(cin>>N)
{
tree(N);
cout<<store[N]<<endl;
}
return 0;
}
/*vector+函數*/
#include <iostream>
#include <vector>
using namespace std;
vector<int> add(vector<int>,vector<int>);
vector<int> mul(vector<int>,vector<int>);
void output(vector<int>);
int main()
{
int N;
vector<int> num[1005];
num[0].push_back(1);
num[1].push_back(1);
num[2].push_back(2);
int MAX=2;
while(cin>>N)
{
if(N<=MAX) output(num[N]);
else
{
for(++MAX;MAX<=N;MAX++)
{
for(int i=0;i<MAX/2;i++)
{
num[MAX]=add(num[MAX],mul(num[i],num[MAX-1-i]));
}
num[MAX]=mul(num[MAX],num[2]);
if(MAX%2)
{
num[MAX]=add(num[MAX],mul(num[MAX/2],num[MAX/2]));
}
}
output(num[--MAX]);
}
}
return 0;
}
vector<int> mul(vector<int> a,vector<int> b)
{
vector<int> Result(a.size()+b.size());
for(int i=0;i<a.size();i++)
{
for(int j=0;j<b.size();j++)
{
Result[i+j]+=a[i]*b[j];
}
}
for(int i=1;i<Result.size();i++)
{
Result[i]+=Result[i-1]/1000;
Result[i-1]%=1000;
}
for(int i=Result.size()-1;i>=0;i--)
{
if(!Result[i]) Result.pop_back();
else break;
}
return Result;
}
vector<int> add(vector<int> a,vector<int> b)
{
vector<int> Result;
int Resize=max(a.size(),b.size());
a.resize(Resize);
b.resize(Resize);
for(int i=0;i<a.size();i++)
{
Result.push_back(a[i]+b[i]);
}
Result.push_back(0);
for(int i=1;i<Result.size();i++)
{
Result[i]+=Result[i-1]/1000;
Result[i-1]%=1000;
}
if(!Result[Result.size()-1]) Result.pop_back();
return Result;
}
void output(vector<int> N)
{
for(int i=N.size()-1;i>=0;i--)
{
if(i!=N.size()-1&&N[i]<100) cout<<"0";
if(i!=N.size()-1&&N[i]<10) cout<<"0";
cout<<N[i];
}
cout<<endl;
}
2014年11月2日 星期日
[UVA] 10303 - How Many Trees ?
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言