• 洛谷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;
    }
  • 相关阅读:
    26个Jquery使用小技巧
    jQuery之浮动窗口
    Visual Studio 2010 TFS指南
    Python
    HTML5小菜
    记一次重构经历【转载】
    Python学习笔记
    Spring.Net+NHibenate+Asp.Net mvc +ExtJs 系列
    搜索分词实现
    UML概要
  • 原文地址:https://www.cnblogs.com/bztMinamoto/p/9544033.html
Copyright © 2020-2023  润新知