Connect the Cable Wires

Asif is a student of East West University and he is currently working for the EWUISP to meet his relatively high tuition fees. One day, as a part of his job, he was instructed to connect cable wires to N houses. All the houses lie in a straight line. He wants to use only the minimum number of cable wires required to complete his task such that all the houses receive the cable service. A house can either get the connection from the main transmission center or it can get it from a house to its immediate left or right provided the latter house is already getting the service.

You are to write a program that determines the number of different combinations of the cable wires that is possible so that every house receives the service.

Example: If there are two houses then 3 combinations are possible as shown in the figure.

                       cableServicetoHouse1,cableServicetoHouse2             cableServicetoHouse1,House1toHouse2               cableServicetoHouse2, House2toHouse1
Figure: circles represent the transmission center and the small rectangles represent the houses.

Input

Each line of input contains a positive integer N (N<=2000). The meaning of N is described in the above paragraph. A value of 0 for N indicates the end of input which should not be processed.

Output

For each line of input you have to output, on a single line, the number of possible arrangements. You can safely assume that this number will have less than 1000 digits.

Sample Input

1
2
3
0

Sample Output

1
3
8


Problem Setter: Sohel Hafiz


注意数据的范围,此题要求不超过1000位,因此只能用字符串运算,也可用java大数运算。其中字符串运算写的有些繁琐。

#include<iostream>
#include<string>
#include<vector>
using namespace std;
#define maxn 2001
vector<char>ve[maxn];
void pow(int a){
    int flag=0,num,no,me;
    for(int i=0;i<ve[a].size();i++){
        if(!flag){
            num=(ve[a][i]-'0')*3;
        }else{
            num=(ve[a][i]-'0')*3+flag;
        }
         flag=num/10;
        char ch='0'+num%10;
         ve[a+1].push_back(ch);
    }
    if(flag){
        char ch='0'+flag;
        ve[a+1].push_back(ch);
    }
   vector<char>::iterator is=ve[a-1].begin();
  vector<char>::iterator it=ve[a+1].begin();
   flag=0;
   while(it!=ve[a+1].end()&&is!=ve[a-1].end()){
        no=*it-'0';
        me=*is-'0';
        //cout<<no<<" "<<me<<endl;
        if(flag){
            no=no+flag;
            if(no<me){
                flag=-1;
                no=no+10-me;
                *it=no+'0';
            }
            else{
                no=no-me;
                *it=no+'0';
                flag=0;
            }

        }else{
            if(no<me){
                flag=-1;
                no=no+10-me;
                *it=no+'0';
            }
            else{
                no=no-me;
                *it=no+'0';
                flag=0;
            }
        }
        it++;
        is++;
   }
   if(it!=ve[a+1].end()){
        if(flag){
            int no=*it-'0';
            no+=flag;
            *it=no+'0';
        }
   }

}
int main(){
    int n;
    ve[0].push_back(0);
    ve[1].push_back('1');
    ve[2].push_back('3');
    ve[3].push_back('8');
    for(int i=4;i<=2000;i++){
        pow(i-1);
    }
    while(cin>>n){
        if(n==0) break;
        char ch='0';
        int no=0;
        for(int i=ve[n].size()-1;i>=0;i--){
            if(ch==ve[n][i]&&!no) continue;
            else{
                no=1;
                cout<<ve[n][i];
            }
        }
       cout<<endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值