
思路别人那里讲的很清楚了,我就不阐述了。链接
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
const int MAXN=+;
int n;
struct Big
{
int num[MAXN],len;
};
Big ans[MAXN]; void dou(Big &x)
{
for (int i=;i<x.len;i++)
{
x.num[i]=x.num[i]*;
if (i>)
{
x.num[i]+=x.num[i-]/;
x.num[i-]=x.num[i-]%;
}
}
if (x.num[x.len-]>)
{
x.num[x.len]=x.num[x.len-]/;
x.num[x.len-]=x.num[x.len-]%;
x.len++;
}
} void plu(Big x,Big y,Big &z)
{
memset(z.num,,sizeof(z.num));
int length=max(x.len,y.len);
for (int i=;i<length;i++)
{
z.num[i]=z.num[i]+x.num[i]+y.num[i];
z.num[i+]=z.num[i]/;
z.num[i]=z.num[i]%;
}
if (z.num[length]!=) z.len=length+;
else z.len=length;
} int main()
{
while (scanf("%d",&n)!=EOF)
{
ans[].num[]=;ans[].len=;
ans[].num[]=;ans[].len=;
for (int i=;i<=n;i++)
{
dou(ans[i-]);
plu(ans[i-],ans[i-],ans[i]);
}
for (int i=ans[n].len-;i>=;i--) cout<<ans[n].num[i];cout<<endl;
}
return ;
}