Problem Statement | |
The factorial of the k-th order of a number n is denoted n!k and defined by the following recurrences: 1<= N <= 1000, 1 <= K <= 100 Examples:N=3, K=1, ans=4. 3!1 = 6, 6的因子分别为1,2,3,6 Solution: 1) 4!0 = 4 4!1 = 4!0 * 3!0 * 2!0 * 1!0 = 4! = 4 * 3 * 2 * 1 4!2 = 4!1 * 3!1 * 2!1 * 1!1 = (4 * 3 * 2 * 1) * (3 * 2 * 1) * (2 * 1) * 1 = (4) * (3*3) * (2*2*2) * (1*1*1*1) 4!3 = 4!2 * 3!2 * 2!2 * 1!2 = (4!1 * 3!1 * 2!1 * 1!1) * (3!1 * 2!1 * 1!1) * (2!1 * 1!1) * (1!1) = (4!1) * (3!1)2 * (2!1)3 * (1!1)4 = 4*3*2*1 * (3*2*1)2 * (2*1)3 * (1*1*1*1) = (4) * (3*3*3) * (2*2*2*2*2*2) * (1*1*1*1*1*1*1*1*1*1) = 41 * 33 * 26 * 110 可以看出 N!K = N^f(N,N,K)*(N-1)^f(N-1,N,k)*...X^f(X,N,K)...2^f(2,N,K)*1^f(1,N,K),f(X,N,K) 表示X在N!K连乘中出现的次数, 1<=X<=N, 当X>N时, f(X, N, K) = 0。 例如 4!1= 4!= 4 * 3* 2 *1,则f(4,4,1)= 1,f(X,N,1) = 1; 4!3 = 41 * 33 * 26 * 110, 则f(3,4,3) = 3, f(2,4,3) = 6. 因为n!k = n!(k-1) * (n-1)!k, 所以f(X,N,K) = f(X, N, K-1) + f(X, N-1, K). 2<=X=N, 1<= k <=K, f(X,1,k) = 0; 1<= n <=N; x<=n f(X,n, 1) = 1, x > n f(X, n, 1) = 0, 可以递推求得f(X,N,K)值,时间复杂度O(X*N*K), 因为X<=N,所以为O(N^2*K)。 其实对于公式f(X,N,K) = f(X, N, K-1) + f(X, N-1, K)来说,X值并不改变,f(x, n, k) = f(x+1, n+1, k)= f(x+T, n+T, k) 这样只需要计算出f(2, n, k), f(x,n,k) = f(2, n-x+2, k), 这样时间复杂度降至O(N*K). 2) 对于一个正整数n, 怎样求其因子个数之和? 假设n = p1^e1 * p2^e2*...*pt^et,则因子个数之和= (e1+1)*(e2+1)*...(et+1)。其中pi表示小于等于n的所有素数。 Code 总结 1. 这题主要考察动态规划和数学知识,刚开始我走进了牛角尖,一直想求出f(x,n,k)的通项公式(二项式定理),导致一直在演算,反而效果不好。 2. 这题主要的技巧在于最后X的降维,将三维将为两维,降低时间复杂度; 3. 程序中需要注意乘积溢出问题,用long long 存储中间结果。
|
TopCoder SRM 569 DIV2 Level3: MegaFactorialDiv2
最新推荐文章于 2018-08-28 11:37:48 发布