51nod1048 整数分解为2的幂 V2

题目
题解
程序可以看我的,我的A了,当然,有些地方还可以优化,但我懒得优化了

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int M=1e9;
char s[31];
int tmp,i,j,k,tot;
struct NUM{
    int t;ll a[201];
}f[100][100],g[100][100],n,ans;
inline NUM operator * (NUM x,NUM y){
    NUM z;z.t=x.t+y.t;
    memset(z.a,0,sizeof(z.a));
    for (int i=0;i<x.t;i++)
        for (int j=0;j<y.t;j++){
            z.a[i+j]+=x.a[i]*y.a[j];
            z.a[i+j+1]+=z.a[i+j]/M;
            z.a[i+j]%=M;
        }
    if (!z.a[z.t-1]) z.t--;
    return z;
}
inline NUM operator + (NUM x,NUM y){
    if (x.t<y.t) swap(x,y);
    x.a[x.t]=0;
    for (int i=0;i<x.t;i++){
        x.a[i]+=y.a[i];
        if (x.a[i]>=M) x.a[i+1]++,x.a[i]-=M;
    }
    if (x.a[x.t]) x.t++;
    return x;
}
inline NUM operator / (NUM x,int y){
    ll k=0;
    for (int i=x.t-1;i>=0;i--){
        k=k*M+x.a[i];
        x.a[i]=k>>1;
        k&=1;
    }
    if (!x.a[x.t-1]) x.t--;
    return x;
}
inline void print(NUM x){
    for (int i=x.t-1;i>=0;i--){
        if (i<x.t-1){
            int k=(int)log10(x.a[i])+1;
            if (!x.a[i]) k=0;
            for (int j=0;j<9-k;j++) putchar('0');
        }
        if (x.a[i]) printf("%d",x.a[i]);
    }
}
int main(){
    gets(s);
    tmp=strlen(s);n.t=tmp/9+1;
    for (i=0;i<tmp;i++){
        j=(tmp-i-1)/9;
        n.a[j]=(n.a[j]<<3)+(n.a[j]<<1)+(s[i]^48);
    }
    f[0][0].t=f[0][0].a[0]=1;
    for (i=1;i<100;i++){
        f[i][i].t=f[i][i].a[0]=1;
        for (j=0;j<i;j++)
            for (k=0;k<=j;k++) f[i][j]=f[i][j]+f[i-1][k]*f[i-k-1][j-k];
    }
    for (i=0;i<100;i++){
        if (n.a[0]&1){
            if (!(tot++)){
                for (j=0;j<=i;j++) g[tot][j]=f[i][j];
            }else{
                for (j=0;j<=i;j++)
                    for (k=0;k<=j;k++) g[tot][j]=g[tot][j]+g[tot-1][k]*f[i-k][j-k];
            }
        }
        n=n/2;
    }
    for (i=0;i<100;i++) ans=ans+g[tot][i];
    print(ans);
}

猜你喜欢

转载自blog.csdn.net/xumingyang0/article/details/80979821