Game of Connections HDU - 1134

http://acm.hdu.edu.cn/showproblem.php?pid=1134


规律,比较好找,就是算起来,会有超级大的数出现,模拟乘法和加法


#include<cstdio>
#include<algorithm>
#include<iostream> 
#include<cstring>
#include<string>
using namespace std;
typedef unsigned long long ll;

string f[110];

string add(string a,string b){
	if(a.length()<b.length()){
		string tmp=b;
		b=a;
		a=tmp;
	}
	reverse(a.begin(),a.end());
	reverse(b.begin(),b.end());
	int sum=0,carry=0;
	string ans;
	ans.clear();
	for(int i=0;i<a.length();i++){
		if(i<b.length())
			sum=a[i]-'0'+b[i]-'0'+carry;
		else
			sum=a[i]-'0'+carry;
		ans += (sum%10+'0');
		carry=sum/10;
	}
	while(carry){
		ans+=(carry%10+'0');
		carry/=10;
	}
	reverse(ans.begin(),ans.end());

	return ans;
} 

string mul(string a,string b){
	if(a.length()<b.length()){
		string tmp=a;
		a=b;
		b=tmp;
	}
	reverse(a.begin(),a.end());
	reverse(b.begin(),b.end());
	string ans;
	ans="";
	//cout<<"a"<<a<<"b"<<b<<endl;
	int pos,carry=0,sum;
	for(int i=0;i<b.length();i++){
		for(int j=0;j<a.length();j++){
			pos=i+j;
			if(pos>=ans.length()){
				sum=(b[i]-'0')*(a[j]-'0')+carry;
				carry=sum/10;
				ans+=(sum%10+'0');
			}
			else{
				sum=(b[i]-'0')*(a[j]-'0')+carry+(ans[pos]-'0');
				carry=sum/10;
				ans[pos]=(sum%10+'0');
			}
		}
		pos=i+a.length();
		while(carry){
			if(pos>=ans.length()){
				sum= carry%10; 
				carry=sum/10; 
				ans += sum+'0';
			}
			else{
				sum = (ans[pos]-'0'+carry)%10;
				carry=sum/10;
				ans[pos]=sum%10;
			}
		}
	}

	reverse(ans.begin(),ans.end());
	return ans;
}


void init(){
	f[1]="1",f[2]="2",f[3]="5";
	string tmp;
	for(int i=4;i<=100;i++){
		tmp.clear();
		for(int j=2;j<=2*i;j+=2){
			if(j==2||j==2*i)
				tmp = add(tmp,f[i-1]);
			else{
				tmp = add(tmp,mul(f[(j-2)/2],f[(2*i-j)/2]));
			}
		}
		f[i]=tmp;
		//cout<<"**"<<tmp<<endl;
	}
}

int main(){
	ios::sync_with_stdio(false);
    init();
    int n;
    while(~scanf("%d",&n)){
    	if(n==-1) break;
    	cout<<f[n]<<endl;
    }
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值