zoukankan      html  css  js  c++  java
  • X-factor Chains [POJ3421] [素数]

    Description
        给定一个正整数X, 一个长度为m的X-因子链是由m+1个整数组成的。其中
        1 = X0, X1, X2, …, Xm = X 满足Xi < Xi+1 且 Xi 整除 Xi+1 。
        现在要求X-因子链的最大长度和最大长度有多少条?
    Input
        多组数据,每一组数据一个正整数X (X ≤ 220).
    Output
        对于每组数据,输出X-因子链的最大长度和最大长度有多少条
    Sample Input
        2
        3
        4
        10
        100
    Sample Output
        1 1
        1 1
        2 1
        2 2
        4 6
    Analysis

    1.子链的长度就是分解质因数后每个质因数个数的和。为什么?如果出现一个合数,必定可以再分解使子链加长。

    2.剩下的工作就是dfs,注意每一步只能选泽一种质数去分解。分解到1记一个贡献

    Code

     1 #include<set>
     2 #include<map>
     3 #include<queue>
     4 #include<stack>
     5 #include<cmath>
     6 #include<cstdio>
     7 #include<cstring>
     8 #include<iostream>
     9 #include<algorithm>
    10 #define RG register int
    11 #define rep(i,a,b)    for(RG i=a;i<=b;++i)
    12 #define per(i,a,b)    for(RG i=a;i>=b;--i)
    13 #define ll long long
    14 #define inf (1<<29)
    15 #define maxn 1048580
    16 #define lim 1048578
    17 using namespace std;
    18 int n,cnt,pt,ans,ans1;
    19 int isp[maxn],p[maxn];
    20 int num[maxn][2];
    21 inline int read()
    22 {
    23     int x=0,f=1;char c=getchar();
    24     while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    25     while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    26     return x*f;
    27 }
    28 
    29 void pre()
    30 {
    31     rep(i,2,lim)
    32     {
    33         if(!isp[i])    p[++cnt]=i;
    34         for(RG j=1;j<=cnt&&p[j]*i<=lim;j++)
    35         {
    36             isp[i*p[j]]=1;
    37             if(!(i%p[j]))    break;
    38         }    
    39     }
    40 }
    41 
    42 void work()
    43 {
    44     int res=n;
    45     rep(i,1,cnt)
    46     {
    47         if(!(res%p[i])){
    48             num[++pt][0]=p[i],num[pt][1]=0;
    49             while(!(res%p[i]))    ++num[pt][1],res/=p[i],++ans1;
    50         }
    51         if(res==1)    break;
    52     }
    53 }
    54 
    55 void dfs(int res)
    56 {
    57     if(res==1){ans++;return;}
    58     for(int i=1;i<=pt;i++)
    59     {
    60         if(num[i][1])    
    61         {
    62             num[i][1]--;
    63             dfs(res/num[i][0]);
    64             num[i][1]++;
    65         }
    66     }
    67 }
    68 
    69 int main()
    70 {
    71     pre();
    72     while(~scanf("%d",&n))
    73     {
    74         pt=ans=ans1=0;
    75         work();
    76         dfs(n);
    77         printf("%d %d
    ",ans1,ans);
    78     }
    79     return 0;
    80 }
    View Code
  • 相关阅读:
    个人作业——软件工程实践总结作业
    团队作业——Beta冲刺5
    Beta冲刺博客集合贴
    团队作业——Beta冲刺4
    团队作业——Beta冲刺3
    团队作业——Beta冲刺2
    团队作业——Beta冲刺1
    Alpha事后诸葛亮(阳光普照队)
    软件产品案例分析
    个人作业——软件工程实践总结作业
  • 原文地址:https://www.cnblogs.com/ibilllee/p/9245566.html
Copyright © 2011-2022 走看看