| ||||||||||
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