题目
题解
程序可以看我的,我的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[201];
}f[100][100],g[100][100],n,ans;
inline NUM operator * (NUM x,NUM y){
NUM z;z.t=x.t+y.t;
memset(z.a,0,sizeof(z.a));
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.a[z.t-1]) z.t--;
return z;
}
inline NUM operator + (NUM x,NUM y){
if (x.t<y.t) swap(x,y);
x.a[x.t]=0;
for (int i=0;i<x.t;i++){
x.a[i]+=y.a[i];
if (x.a[i]>=M) x.a[i+1]++,x.a[i]-=M;
}
if (x.a[x.t]) x.t++;
return x;
}
inline 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>>1;
k&=1;
}
if (!x.a[x.t-1]) x.t--;
return x;
}
inline void print(NUM x){
for (int i=x.t-1;i>=0;i--){
if (i<x.t-1){
int k=(int)log10(x.a[i])+1;
if (!x.a[i]) k=0;
for (int j=0;j<9-k;j++) putchar('0');
}
if (x.a[i]) printf("%d",x.a[i]);
}
}
int main(){
gets(s);
tmp=strlen(s);n.t=tmp/9+1;
for (i=0;i<tmp;i++){
j=(tmp-i-1)/9;
n.a[j]=(n.a[j]<<3)+(n.a[j]<<1)+(s[i]^48);
}
f[0][0].t=f[0][0].a[0]=1;
for (i=1;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);
}