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[150];
	friend void print(NUM x){
		if (!x.t){puts("0");return;}
		printf("%lld",x.a[--x.t]);
		int t[9];
		for (int i=x.t-1;i>=0;i--){
			memset(t,0,sizeof(t));
			for (int j=0;j<9;j++) t[j]=x.a[i]%10,x.a[i]/=10;
			for (int j=8;j>=0;j--) putchar(t[j]|48);
		}
		puts("");
	}
	friend NUM operator+(NUM x,NUM y){
		int i;
		for (i=0;i<x.t || i<y.t || x.a[i];i++){
			if (i+1>=x.t) x.a[i+1]=0;
			if (i<y.t) x.a[i]+=y.a[i];
			if (x.a[i]>=M) x.a[i+1]++,x.a[i]-=M;
		}
		x.t=i;
		return x;
	}
	friend NUM operator*(NUM x,NUM y){
		NUM z;z.t=x.t+y.t;
		memset(z.a,0,z.t<<3);
		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.t && !z.a[z.t-1]) z.t--;
		return z;
	}
	friend 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/y;
			k%=y;
		}
		while (x.t && !x.a[x.t-1]) x.t--;
		return x;
	}
}n,f[100][100],g[100][100],ans;
NUM toNUM(char s[]){
	ll f[10];
	f[0]=1;
	for (int i=1;i<10;i++) f[i]=f[i-1]*10;
	NUM A;
	A.t=strlen(s);
	memset(A.a,0,(A.t-1)/9+1<<3);
	for (int i=A.t-1;i>=0;i--) A.a[(A.t-1-i)/9]+=f[(A.t-1-i)%9]*(s[i]^48);
	A.t=(A.t-1)/9+1;
	return A;
}
int main(){
	gets(s);n=toNUM(s);
	for (i=0;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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值