洛谷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;
}

 

转载于:https://www.cnblogs.com/bztMinamoto/p/9544033.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值