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

大爷的,TLE,不做了

Posted by Pzjay at 2010-08-16 23:23:55 on Problem 3421

const int sup = 1005000;//预留sup个位置,略大于oo范围内生成的实际素数个数
const int oo = 1100000;
bool isp[oo + 10];
int prime[sup];
int ans[sup];
int cnt;
void Generate()
{
	memset(isp, 1, sizeof(isp));
	isp[0] = isp[1] = false;
	for(int i = 2; i <= (oo >> 1); ++i)
		if(isp[i]) for(int j = 2; i * j <= oo; ++j)
			isp[i * j] = false;
	cnt = 0;
	for(int i = 2; i <= oo; ++i)
		if(isp[i]) prime[cnt++] = i;
}
void Generatee()
{
	int i, j;
	cnt = 0;
	for (i = 2; i < oo; ++i)
	{
		if (isp[i]) continue;
		for (j = i + i; j < oo; j += i)  isp[j] = true;
		prime[cnt++] = i;
	}
}
int split(int k)
{
	int ct = 0;//计数所有素因子的个数总和
	for(int i = 0; i < cnt && k > 0 && prime[i] <= k; ++ i)
	{
		while(0 == k % prime[i])
		{
			k /= prime[i];
			++ ans[i];//第i个素因子的个数
		}
		ct += ans[i];
	}
	return ct;
}
#define i64 __int64

i64 fact(i64 x)//求x!
{
	i64 tp = 1;
	for(int i = 2; i <= x; ++i)  tp *= i;
	return tp;
}
int main()
{
	int k;
	Generate();
	//freopen("in.txt", "r", stdin);
	//freopen("1.txt", "w", stdout);
	while(scanf("%d", &k) != EOF)
	{
		memset(ans, 0, sizeof(ans));
		int ct = split(k);
		i64 num = fact(ct);
		for(int i = 0; i < cnt; ++i)
			if(ans[i])  num /= fact(ans[i]);
		if(0 == ct)  ct = 1;
		printf("%d %I64d\n", ct, num);
		//if((1 << 20) == k) return 0;
	}
	return 0;
}

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