zjoi2012数列

跪跪跪、、、、、


高精度  

本来想记忆化  结果范围太大   乱搞辣


#include <cstdio>
#include <cstring>
int T;
struct bigint {
	int a[30],l;
	bigint () {
		memset(a,0,sizeof a);
		l = 1;
	}
	void zero () {
		while(a[l] == 0 && l != 1)
			l--;
	}
	void read () {
		char s[101];
		memset(s,0,sizeof s);
		scanf("%s",s);
		int le = strlen(s) - 1;
		int t = 1;
		for(int i = le;i >= 0;i--) {			
			a[l] += (s[i] - '0') * t;
			t *= 10;
			if(t == 10000) {
				l++;
				t = 1;
			}
		}
	}
	bigint operator / (const int b) {
		bigint re = *this;
		for(int i = l;i >= 2;i--) {
			if(re.a[i] % 2) {
				re.a[i]--;
				re.a[i - 1] += 10000;
			}
			re.a[i] /= 2;
		}
		re.a[1] /= 2;
		while(re.a[re.l] == 0 && re.l != 1)
			re.l--;
		return re;
	}
	bigint operator + (const bigint &b) {
		bigint c;
		
		c.l = l > b.l ? l + 1 : b.l + 1;
		for(int i = 1;i <= c.l;i++) {
			c.a[i] += a[i] + b.a[i];
			c.a[i + 1] += c.a[i] / 10000;
			c.a[i] %= 10000;
		}
		c.zero();
		return c;
	}
	void print () {
		printf("%d",a[l]);
		for(int i = l - 1;i >= 1;i--)
			printf("%04d",a[i]);
		printf("\n");
	}
}n,o,z,p,q;
void dfs (bigint N) {
	if(N.a[1] == 1 && N.l == 1) {
		p = o;
		q = z;
		return;
	}
	dfs((N + o) / 2);
	if(N.a[1] & 1)
		p = p + q;
	else q = q + p;	
}
int main () {	
	o.a[1] = 1;
	scanf("%d",&T);
	while(T--) {
		n.l = 1;
		memset(n.a,0,sizeof(n.a));
		n.read();
		dfs(n);
		p.print();
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值