传送门
题解
// luogu-judger-enable-o2
//minamoto
#include<cstdio>
#include<cstring>
using namespace std;
const int N=1005;
char s[N];int n;
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
struct node{
int s[N];
void clear(){
memset(s,0,sizeof(s));
}
void operator =(int val){
clear();
while(val){
s[++s[0]]=val%10,val/=10;
}
}
void operator =(const char *str){
int len=strlen(str);
s[0]=len;
for(int i=0;i<len;++i) s[s[0]-i]=str[i]-'0';
}
void maintain(){
for(int i=1;i<=s[0];++i) if(s[i]>9) s[i+1]+=s[i]/10,s[i]%=10;
while(s[s[0]+1]){
++s[0],s[s[0]+1]=s[s[0]]/10,s[s[0]]%=10;
}
}
void operator +=(const int &a){
s[1]+=a,maintain();
}
void operator +=(node a){
cmax(s[0],a.s[0]);
for(int i=1;i<=s[0];++i) s[i]+=a.s[i];
maintain();
}
void operator -=(const int &a){
int i=1;s[i]-=a;
while(s[i]<0){
while(s[i]<0) s[i]+=10,--s[i+1];
++i;
}
if(!s[s[0]]) --s[0];
}
int mod(){
return s[1]&1;
}
void div(){
for(int i=s[0];i;--i){
if(i>1&&s[i]&1) s[i-1]+=10;
s[i]>>=1;
}
if(!s[s[0]]) --s[0];
}
void mul(){
for(int i=1;i<=s[0];++i) s[i]*=2;
maintain();
}
void print(){
for(int i=s[0];i;--i) printf("%d",s[i]);
}
}ans,res,num;
int b[N*N];
int main(){
//freopen("testdata.in","r",stdin);
scanf("%s",s);
num=s;
n=0;
while(num.s[0]){
b[n++]=num.mod(),num.div();
}
if(n>1){
int mid=(n-1)>>1;
ans=3-(n&1);
for(int i=0;i<mid;++i) ans.mul();
ans-=2;
res.clear();
for(int i=n-2;i>=n-mid-1;--i) res.mul(),res+=b[i];
bool flag=true;
for(int i=mid;~i;--i) if(b[i]!=b[n-i-1]){flag=(b[i]>b[n-i-1]);break;}
if(flag) res+=1;
ans+=res;
}else ans=n;
ans.print();
return 0;
}