zoukankan      html  css  js  c++  java
  • poj3421 X-factor Chains——分解质因数

    题目:http://poj.org/problem?id=3421

    好久没有独立A题了...做点水题还是有助于提升自信心的;

    这题就是把 x 质因数分解,质因数指数的和 sum 就是最长的长度,因为每次至少乘一个质因数;

    排列方式就是从 sum 个位置里给第一种质因数选几个位置,再在剩下的里面给第二种质因数选几个位置...

    也就是 ans = ∏(1<=i<=cnt) C(n,pc[i]),n -= pc[i],其中 cnt 是质因数(种类)个数,pc 是每种质因数的指数,n 就是目前剩下几个位置。

    代码如下:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    typedef long long ll;
    int x,p[25],pc[25],cnt;
    void divide(int n)
    {
        cnt=0;
        memset(pc,0,sizeof pc);
        for(int i=2;i*i<=n;i++)
            if(n%i==0)
            {
                p[++cnt]=i;
                while(n%i==0)pc[cnt]++,n/=i;
            }
        if(n>1)p[++cnt]=n,pc[cnt]=1;
    }
    ll C(int n,int m)
    {
        if(n<m)return 0;
        m=min(m,n-m);
        ll a=1,b=1;
        for(int i=n-m+1;i<=n;i++)a*=i;
        for(int i=2;i<=m;i++)b*=i;
        return a/b;
    }
    int main()
    {
        while(~scanf("%d",&x))
        {
            divide(x);
            int sum=0; ll ans=1;
            for(int i=1;i<=cnt;i++)sum+=pc[i];
            int n=sum;
            for(int i=1;i<=cnt;i++)
            {
                ans*=C(n,pc[i]);
                n-=pc[i];
            }
            printf("%d %lld
    ",sum,ans);
        }
        return 0;
    }
  • 相关阅读:
    闭包 与 装饰器
    Linux常用命令 (二)
    day1 linux常用命令(一)
    📎 .xib
    📎 Emoji 前端转换
    📎 钉钉微应用( 新启项目Weex H5 )
    📎 ROR:常用GEM
    📎 AndroidNative【ING...】
    🆕 ror方法
    安装centos7
  • 原文地址:https://www.cnblogs.com/Zinn/p/9264971.html
Copyright © 2011-2022 走看看