当前位置: 代码迷 >> 综合 >> AcWing 1295. X的因子链 理解
  详细解决方案

AcWing 1295. X的因子链 理解

热度:46   发布时间:2023-11-23 13:45:51.0

AcWing 1295. X的因子链

输入正整数 X,求 X 的大于 1 的因子组成的满足任意前一项都能整除后一项的严格递增序列的最大长度,以及满足最大长度的序列的个数。

输入格式
输入包含多组数据,每组数据占一行,包含一个正整数表示 X。

输出格式
对于每组数据,输出序列的最大长度以及满足最大长度的序列的个数。

每个结果占一行。

数据范围
1≤X≤220
输入样例:

2
3
4
10
100

输出样例:

1 1
1 1
2 1
2 2
4 6

这道题其实我刚开始一直没有理解明白,后来仔细看了y总的视频,发现其实语句的错误让我对这题产生了误解——(任意前一项都能整除后一项的严格递增序列)

这句话应该改成任意后一项都能整除前一项的严格递增序列。

然后这样去理解就很轻松了,我觉得y总的方法确实很麻烦,在理解题意的基础上其实我明白序列的长度是质因子的个数,然后我们序列的种类是Cx1n1+Cx2n2+Cx3n3+Cx4n4+Cx5n5+Cx6n6

然后我们开始写一下代码。
res是质因数的个数,ans是res的阶乘,然后cnt是每个质因数的阶乘。
最终实现这个式子
Cx1n1+Cx2n2+Cx3n3+Cx4n4+Cx5n5+……+Cxnxn

代码如下:

#include<iostream>using namespace std;const int N=1e5+10;int main(void)
{
    int n;int cnt=0;while(~scanf("%d",&n)){
    int res=0;//质因数的个数int t=n;long long cnt=1,ans=1;for(int i=2;i<=n/i;i++){
    int d=0;while(n%i==0){
    d++;n/=i;cnt*=d;}res+=d;}if(n>1)res++;for(int i=1;i<=res;i++)ans*=i;cout<<res<<" "<<ans/cnt<<endl;}
}