题目
题解
程序可以看我的,我的A了,当然,有些地方还可以优化,但我懒得优化了
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int M=1e9;
char s[31];
int tmp,i,j,k,tot;
struct NUM{
int t;
ll a[150];
friend void print(NUM x){
if (!x.t){puts("0");return;}
printf("%lld",x.a[--x.t]);
int t[9];
for (int i=x.t-1;i>=0;i--){
memset(t,0,sizeof(t));
for (int j=0;j<9;j++) t[j]=x.a[i]%10,x.a[i]/=10;
for (int j=8;j>=0;j--) putchar(t[j]|48);
}
puts("");
}
friend NUM operator+(NUM x,NUM y){
int i;
for (i=0;i<x.t || i<y.t || x.a[i];i++){
if (i+1>=x.t) x.a[i+1]=0;
if (i<y.t) x.a[i]+=y.a[i];
if (x.a[i]>=M) x.a[i+1]++,x.a[i]-=M;
}
x.t=i;
return x;
}
friend NUM operator*(NUM x,NUM y){
NUM z;z.t=x.t+y.t;
memset(z.a,0,z.t<<3);
for (int i=0;i<x.t;i++)
for (int j=0;j<y.t;j++){
z.a[i+j]+=x.a[i]*y.a[j];
z.a[i+j+1]+=z.a[i+j]/M;
z.a[i+j]%=M;
}
if (z.t && !z.a[z.t-1]) z.t--;
return z;
}
friend NUM operator/(NUM x,int y){
ll k=0;
for (int i=x.t-1;i>=0;i--){
k=k*M+x.a[i];
x.a[i]=k/y;
k%=y;
}
while (x.t && !x.a[x.t-1]) x.t--;
return x;
}
}n,f[100][100],g[100][100],ans;
NUM toNUM(char s[]){
ll f[10];
f[0]=1;
for (int i=1;i<10;i++) f[i]=f[i-1]*10;
NUM A;
A.t=strlen(s);
memset(A.a,0,(A.t-1)/9+1<<3);
for (int i=A.t-1;i>=0;i--) A.a[(A.t-1-i)/9]+=f[(A.t-1-i)%9]*(s[i]^48);
A.t=(A.t-1)/9+1;
return A;
}
int main(){
gets(s);n=toNUM(s);
for (i=0;i<100;i++){
f[i][i].t=f[i][i].a[0]=1;
for (j=0;j<i;j++)
for (k=0;k<=j;k++) f[i][j]=f[i][j]+f[i-1][k]*f[i-k-1][j-k];
}
for (i=0;i<100;i++){
if (n.a[0]&1){
if (!(tot++)) for (j=0;j<=i;j++) g[tot][j]=f[i][j];
else for (j=0;j<=i;j++)
for (k=0;k<=j;k++) g[tot][j]=g[tot][j]+g[tot-1][k]*f[i-k][j-k];
}
n=n/2;
}
for (i=0;i<100;i++) ans=ans+g[tot][i];
print(ans);
}