当前位置: 代码迷 >> 综合 >> X-因子链(factor)
  详细解决方案

X-因子链(factor)

热度:94   发布时间:2024-02-13 00:17:48.0

D e s c r i p t i o n Description

给一个正整数X,一个长度为m的X-因子链是指这样一个序列:X0=1,X1,X2,。。。,Xm=X满足:Xi<Xi+1同时Xi|Xi+1(Xi+1能被Xi整除)
要求X-因子链的最大长度Len和长度为Len的X-因子链的数量。

I n p u t Input

一个正整数X

O u t p u t Output

一行,两个整数,分别表示最大长度和该长度链的种数。

S a m p l e Sample I n p u t Input
100
S a m p l e Sample O u t p u t Output
4 6

H i n t Hint

对于20%的数据:X<=20,000;
对于100%的数据:X<=2^31;且保证因子链最大长度小于等于20;

T r a i n Train o f of T h o u g h t Thought

就是求质因数分解的个数
然后数量就是 ( ! ) / ( ( ) ! ) (质因数个数!)/((相同元素重复个数)!)

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define ll long long
using namespace std;int A[55], S[55];
int n, m, Sum;
ll Ans;int main()
{scanf("%d", &n);for(int i  = 2; i <= n / i; ++i)if(n % i == 0){S[++m] = 1, n /= i;while(n % i == 0)n/= i, S[m]++;Sum += S[m];}if(n > 1)S[++m] = 1, Sum += S[m];printf("%d ", Sum);Ans = 1;for(int i = 2; i <= Sum; ++i)Ans *= i;for(int i = 1; i <= m; ++i)for(int j = 2; j <= S[i]; ++j)Ans /= j;printf("%lld", Ans);return 0;
}