Race to 1 UVA11762

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <queue>
#include <algorithm>
#include <vector>
#include <cstring>
#include <stack>
#include <cctype>
#include <utility>   
#include <map>
#include <string>  
#include <climits> 
#include <set>
#include <string>    
#include <sstream>
#include <utility>   
#include <ctime>

using std::priority_queue;
using std::vector;
using std::swap;
using std::stack;
using std::sort;
using std::max;
using std::min;
using std::pair;
using std::map;
using std::string;
using std::cin;
using std::cout;
using std::set;
using std::queue;
using std::string;
using std::istringstream;
using std::make_pair;
using std::greater;
using std::endl;

const int MAXN(1000000);

int prime[110000];
int count_prime;
bool is_prime[1000010];

void init_prime()
{
	memset(is_prime, -1, sizeof(is_prime));
	is_prime[1] = false;
	for(int i = 2; i <= MAXN; ++i)
		if(is_prime[i])
		{
			prime[count_prime++] = i;
			for(int j = i+i; j <= MAXN; j += i)
				is_prime[j] = false;
		}
}

bool vis[1000010];
double table[1000010];

double fun(int n)
{
	if(n == 1)
		return 0.;
	if(vis[n])
		return table[n];
	double &cur = table[n];
	cur = 0;
	int temp = 0;
	int i = 0;
	for(i = 0; i < count_prime && prime[i] <= n; ++i)
		if(n%prime[i] == 0)
		{
			cur += fun(n/prime[i]);
			++temp;
		}
	cur += i;
	cur /= temp;
	vis[n] = true;
	return cur;
}

int main()
{
	int T, n_case(0);
	init_prime();
	scanf("%d", &T);
	while(T--)
	{
		int n;
		scanf("%d", &n);
		printf("Case %d: %.10f\n", ++n_case, fun(n));
	}
	return 0;
}

你可能感兴趣的:(Race to 1 UVA11762)