其他分享
首页 > 其他分享> > bzoj#2656. [Zjoi2012]数列(sequence)

bzoj#2656. [Zjoi2012]数列(sequence)

作者:互联网

https://darkbzoj.cc/problem/2656

https://www.luogu.com.cn/problem/P2609

\[A[i]=A[\frac{i}{2}],2\mid i \]

\[A[i]=A[\frac{i}{2}]+A[\frac{i}{2}+1],2 \not\mid i \]

考虑递归转递推,这种一定能转化为 \(k_1A_0+k_2A_1\) 的形式。

考虑当前有 \(ans=k_1A_i+k_2A_{i+1}\)

若 \(i\) 为奇数,那么 \(ans=k_1(A[\frac{i}{2}]+A[\frac{i}{2}+1])+k_2A[\frac{i}{2}+1]\),那么 \(K1=k1,K2=k1+k2\)

反之,\(ans=k_1A[\frac{i}{2}]+k_2A[\frac{i}{2}]+k_2A[\frac{i}{2}+1]\),即 \(K_1=k_1+k_2,K_2=k_2\)

做到为 0 的时候就好了。

写个高精!

#include <bits/stdc++.h>
//#define int long long
#define pb push_back
using namespace std;
struct Bignum {
	int a[205],len;
	Bignum(int x) {
		memset(a,0,sizeof(a));
		int qwq=0;
		while(x) a[++qwq]=x%10,x/=10;
		len=qwq;
	}
	Bignum() {
		len=0; memset(a,0,sizeof(a));
	}
};
Bignum add(Bignum x,Bignum y) {
	Bignum tmp;
	int n=x.len,m=y.len;
	for(int i=1;i<=max(n,m);i++) {
		tmp.a[i]+=x.a[i]+y.a[i];
		tmp.a[i+1]+=tmp.a[i]/10; tmp.a[i]%=10;
	}
	tmp.len=max(n,m); if(tmp.a[tmp.len+1]) ++tmp.len;
	return tmp;
}

Bignum mul(Bignum x,int y) {
	Bignum tmp;
	int n=x.len;
	for(int i=1;i<=n;i++) {
		tmp.a[i]=x.a[i]*y; tmp.a[i+1]+=tmp.a[i]/10; tmp.a[i]%=10;
	}
	for(int i=n+1;i<=200;i++) {
		if(tmp.a[i]<10) break ;
		tmp.a[i+1]+=tmp.a[i]/10; tmp.a[i]%=10;
	}
	for(int i=200;i>=n;i--) {
		if(tmp.a[i]) {
			tmp.len=tmp.a[i]; break ;
		}
	}
	return tmp;
}

void PR(Bignum x) {
	int qwq=x.len;
	if(!qwq) {
		cout<<"0"; return ;
	}
	for(int i=qwq;i>=1;i--) cout<<x.a[i];
}

char s[105];
int n;
void solve() {
	cin>>s+1; n=strlen(s+1);
	for(int i=1;i<=n;i++) s[i]-='0';
	reverse(s+1,s+1+n);
	Bignum k1=Bignum(1),k2=Bignum(0),tmp1,tmp2; //偶 奇
//	PR(k1); cout<<'\n'; PR(k2); cout<<"over\n";
	while(1) {
		if(n==0) {
			PR(k2); cout<<'\n';
			return ;
		}
		bool fl=s[1]&1;
		for(int i=n;i>=1;i--) {
			if(s[i]&1) s[i-1]+=10;
			s[i]/=2;
		}
		while(!s[n]&&n>=1) --n;
		if(fl) {
			tmp1=k1; tmp2=k2;
			k1=tmp1; k2=add(tmp1,tmp2);
		} else {
			tmp1=k1; tmp2=k2;
			k1=add(tmp1,tmp2); k2=tmp2;
		}
	}
}

signed main() {
	cin.tie(0); ios::sync_with_stdio(false);
	int T; cin>>T; while(T--) solve();
	return 0;
}

标签:tmp,Bignum,sequence,int,2656,len,k1,Zjoi2012,frac
来源: https://www.cnblogs.com/xugangfan/p/16497871.html