[BZOJ 2656][Zjoi2012]数列(sequence):高精度+递推

点击这里查看原题

读入n,转为2进制,每次记录(x,x+1)两个值,如果当前位为1,转化为(2x+1,2x+2),否则转化为(2x,2x+1)(用二进制来表示x就是n的当前位为1,则在x后面添1,否则添0),即可得到 an 的值
高精度细节很多,要小心

/*
User:Small
Language:C++
Problem No.:2656
*/
#include<bits/stdc++.h>
#define ll long long
#define inf 999999999
using namespace std;
const int M=5005;
struct bignum{
    int num[M],len;
    bignum(int a=0){*this=a;}
    void clear(){
        memset(num,0,sizeof(num));
        len=0;
    }
    int& operator[](int x){
        return num[x];
    }
    bignum operator=(const char *s){
        clear();
        len=strlen(s+1);
        for(int i=1;i<=len;i++) num[i]=s[len+1-i]-'0';
        return *this;
    }
    bignum operator=(int x){
        clear();
        for(;x;x/=10){
            num[++len]=x%10;
        }
        if(!len) len++;
        return *this;
    }
    bool operator<(const bignum b)const{
        if(len!=b.len) return len<b.len;
        for(int i=len;i;i--){
            if(num[i]!=b.num[i]) return num[i]<b.num[i];
        }
        return 0;
    }
    bool operator>(const bignum b)const{
        return b<*this;
    }
    void modify(){
        int x=0,i=1;
        for(;x||i<=len;i++){
            x+=num[i];
            num[i]=x%10;
            x/=10;
        }
        len=max(len,i-1);
        for(;!num[len]&&len>1;len--);
    }
    void print(){
        for(int i=len;i;i--) printf("%d",num[i]);
        printf("\n");
    }
}a,b;
bignum operator+(bignum a,bignum b){
    bignum c;
    c.clear();
    c.len=max(a.len,b.len);
    for(int i=1;i<=c.len;i++){
        c[i]=a[i]+b[i];
    }
    c.modify();
    return c;
}
bignum operator/(bignum a,int b){
    bignum c;
    c.clear();
    int x=0;
    for(int i=a.len;i;i--){
        x=x*10+a[i];
        if(x<b) continue;
        c[i]=x/b;
        x%=b;
        if(!c.len) c.len=i;
    }
    if(!c.len) c.len=1;
    return c;
}
int n,bi[M],len;
char s[M];
void solve(){
    scanf("%s",s+1);
    a=s;
    len=0;
    while(a>0){
        bi[++len]=a[1]&1;
        a=a/2;
    }
    a=0;
    b=1;
    for(int i=len;i;i--){
        if(bi[i]) a=a+b;
        else b=a+b;
    }
    a.print();
}
int main(){
    freopen("data.in","r",stdin);//
    int t;
    scanf("%d",&t);
    while(t--) solve();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/SmallSXJ/article/details/73250712
今日推荐