Ray Through Glasses

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=30506#problem/T

题意:给你一束光,问你在一个三层的平面类传递n次的种数;

仔细想下,就是一个fibonacci数列;

 

#include<map>
#include<set>
#include<list>
#include<cmath>
#include<ctime>
#include<deque>
#include<stack>
#include<bitset>
#include<cstdio>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<iomanip>
#include<numeric>
#include<sstream>
#include<utility>
#include<iostream>
#include<algorithm>
#include<functional>

using namespace std ;

vector<string> Fibs ;
void CalFibs()
{
	const int maxn = 10000 ;
	int carry , i , j  , size1 , size2 , num1 , num2 ;
	string add1 , add2 ;
	add1 = '1' ;
	add2 = '2' ;
	Fibs.push_back( add1 ) ;
	Fibs.push_back( add2 ) ;
	for( int k = 3 ; k <= maxn ; ++k )
	{
		string sum ;
		carry = 0 ;
		i = j = 0 ;
		size1 = add1.size() ;
		size2 = add2.size() ;
		while( i < size1 || j < size2 )
		{
			if( i < size1 )
			{
				num1 = add1[ i ] - '0' ;
				++i ;
			}
			else
			{
				num1 = 0 ;
			}
			if( j < size2 )
			{
				num2 = add2[ j ] - '0' ;
				++ j ;
			}
			else
			{
				num2 = 0 ;
			}
			num1 += ( num2 + carry ) ;
			carry = num1 / 10 ;
			num1 %= 10 ;
			sum.push_back( num1 + '0' ) ;
		}
		if( carry )
		{
			sum.push_back( carry + '0' ) ;
		}
		Fibs.push_back( sum ) ;
		add1 = add2 ;
		add2 = sum ;
	}
}

int main()
{
	CalFibs() ;
	int n , i ;
	string result ;
	while( cin >> i )
	{
		i += 2 ;
		result = Fibs[ i - 1 ] ;
		for( i = result.size() - 1 ; i >= 0 ; --i )
		{
			cout << result[ i ] ;
		}
		cout << endl ;
	}
    return 0;
}


 

 

posted on 2013-09-09 20:51  you Richer  阅读(205)  评论(0编辑  收藏  举报