思路
一种简单的构造方法就是将作为最后一个数,之前每个数是后一个数除以任意一个因子,这样构造一定是最优的.
因此第一个答案就显而易见了,就是的质因子个数
.(这里若
,
算
个质因子)
如果不是任何质数的平方的倍数,那么方案就是每次除以的因子的全排列
.如果
,
的排列会有重复,也就是说
会重复计算.因此若
,第二个答案就是
.
很简单吧.复杂度是.
代码
#include<bits/stdc++.h>
using namespace std;
#define i64 long long
#define fp( i, b, e ) for ( int i(b), I(e); i <= I; ++i )
#define fd( i, b, e ) for ( int i(b), I(e); i >= I; --i )
#define go( i, b ) for ( int i(b), v(to[i]); i; v = to[i = nxt[i]] )
template<typename T> inline void cmax( T &x, T y ){ x < y ? x = y : x; }
template<typename T> inline void cmin( T &x, T y ){ y < x ? x = y : x; }
clock_t t_bg, t_ed;
int N, c1, c2;
i64 ans1, ans2;
signed main(){
t_bg = clock();
while( ~scanf( "%d", &N ) ){
ans1 = ans2 = 1, c1 = 0;
for ( int i = 2; i * i <= N; ++i ){
c2 = 0;
while( N % i == 0 ) ans1 *= ++c1, ans2 *= ++c2, N /= i;
} if ( N > 1 ) ans1 *= ++c1;
printf( "%d %lld\n", c1, ans1 / ans2 );
}
t_ed = clock();
fprintf( stderr, "\n========info========\ntime : %.3f\n====================\n", (double)( t_ed - t_bg ) / CLOCKS_PER_SEC );
return 0;
} 
京公网安备 11010502036488号