| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
大爷的,TLE,不做了
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: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator