洛谷P2235 [HNOI2002]Kathy函数
// 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; }
深深地明白自己的弱小