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;

}


 

 

你可能感兴趣的:(AS)