zoukankan      html  css  js  c++  java
  • X的因子链(分解质因数,)

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

    输入格式

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

    输出格式

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

    每个结果占一行。

    数据范围

    1X2201≤X≤220

    输入样例:

    2
    3
    4
    10
    100
    

    输出样例:

    1 1
    1 1
    2 1
    2 2
    4 6

     思路:由于是要求这个序列的任意一项能整除他的前一项,要想要这个序列最大,那么任意两项之间的倍数要求最小。那么最小就是一个质数。由于序列都是由X的因子组成,所以每个数字都是有质因子组成的。初始值为1的话,X一共有几个质因子,序列最大有几个数字。

    #include<iostream>
    using namespace std;
    
    const int maxn= (1 << 20 ) + 10;
    int primes[maxn],cnt;
    bool st[maxn];
    int minp[maxn];
    long long  f[30];
    void get_prime(int n)
    {
        for(int i=2;i<=n;i++)
        {
            if(!st[i])
            {
                primes[++cnt]=i;
                minp[i]=i;
            }
            for(int j=1;primes[j]*i<=n;j++)
            {
                st[primes[j]*i]=true;
                minp[primes[j]*i]=primes[j];
                if(i%primes[j]==0)
                {
                    break;
                }
            }
        }
    }
    
    int main()
    {
        get_prime(maxn);
        f[0]=1;
        for(int i=1;i<=20;i++)
        {
            f[i]=f[i-1]*i;
        }
        int x;
        while(cin >> x)
        {
            long long  res=1;
            int tot=0;
            while(x>1)
            {
                int p=minp[x];
                int k=0;
                while(x%p==0)
                {
                    x/=p;
                    tot++,k++;
                }
                res*=f[k];
            }
            cout << tot << " " << f[tot]/res << endl;
        }
        return 0;
    }
  • 相关阅读:
    !!!最常用正则表达式语法
    RunMessageScript from spy
    已知进程、线程、窗体三者中某一个的句柄,需要查找另外两者的句柄。
    如何抓取一个当前运行软件所使用的内存
    谢谢你的伤害
    游摸底河有感
    九月无诗
    游石人公园有感
    影响35岁前成功的好习惯与坏习惯
    创业经验十二谈,愿有志者共勉(转)
  • 原文地址:https://www.cnblogs.com/wjc2021/p/12333830.html
Copyright © 2011-2022 走看看