ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-07-20 14:34:05  阅读:84  来源: 互联网

标签:tmp Bignum sequence int 2656 len k1 Zjoi2012 frac


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有