Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

想了一晚上的题目,觉得挺有意思的,也来贴个ac的代码

Posted by 278466061 at 2015-01-26 09:04:51 on Problem 1090
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

#define MAX 1000
#define ONEINT 1000000
struct BigInt
{
	int num[60];
	int length;
}count[MAX+10];
bool chain[MAX+10];

BigInt add(BigInt a, BigInt b)
{
	int length = a.length;
	if(b.length > length)
		length = b.length;
	int stepin = 0;
	for(int i = 0; i <= length; ++i)
	{
		a.num[i] += stepin+b.num[i];
		stepin = a.num[i]/ONEINT;
		a.num[i] = a.num[i]%ONEINT;
	}
	if(a.num[a.length])
		++a.length;
	return a;	
}

BigInt sub(BigInt a, BigInt b)
{
	for(int i = 0; i < b.length; ++i)
	{
		a.num[i] -= b.num[i];
		if(a.num[i] < 0)
		{
			a.num[i] += ONEINT;
			a.num[i+1]--;
		}
	}
	while(!a.num[a.length-1] && a.length>1)
		--a.length;
	return a;
}

string Int2String(BigInt a)
{
	int i, j;
	string out = "";
	for(i = 1; i <= a.length; ++i)
	{
		string tmp = "000000";
		int j = 5;
		while(a.num[a.length-i])
		{
			tmp[j] += a.num[a.length-i]%10;
			a.num[a.length-i] /= 10;
			--j;
		}
		out += tmp;
	}
	for(i = 0; i < out.length(); ++i)
	{
		if(out[i] != '0')
			break;
	}
	return out.substr(i);
}

BigInt foo(int n)
{
	BigInt current;
	if(n <= 0)
		return count[0];
	current = count[n];
	//cout << Int2String(current) << endl;
	--n;
	while(n>=0 && !chain[n])
		--n;
	if(n >= 0)
		current = sub(current, foo(n));
	return current;
}

int main()
{
	BigInt one;
	one.length = 1;
	memset(one.num, 0, sizeof(one.num));
	one.num[0] = 1;
	int N;
	cin >> N;
	memset(count, 0, sizeof(count));	
	count[0].length = 1;
	count[0].num[0] = 1;
	for(int n = 1; n <= N; ++n)
	{
		count[n] = add(count[n-1], count[n-1]);
		count[n] = add(count[n], one);
		//cout << Int2String(count[n]) << endl;
		cin >> chain[n-1];
	}
	--N;
	while(N>=0 && !chain[N])
		--N;
	if(N >= 0)
		cout << Int2String(foo(N)) << endl;
	else
		cout << 0 << endl;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator