UVA - 10791 分解质因数(唯一分解定理)

参考https://www.cnblogs.com/scau20110726/archive/2013/01/18/2866101.html

题意(就是因为读错题意而wa了一次):给一个数字n,范围在[1,2^23-1],这个n是一系列数字的最小公倍数,这一系列数字的个数至少为2

例如12,是1和12的最小公倍数,是3和4的最小公倍数,是1,2,3,4,6,12的最小公倍数,是12和12的最小公倍数………………

那么找出一个序列,使他们的和最小,上面的例子中,他们的和分别为13,7,28,24……显然最小和为7

算术基本定理,又称为正整数的唯一分解定理,即:每个大于1的自然数均可写为质数的积,而且这些素因子按大小排列之后,写法仅有一种方式。例如:
 
算术基本定理的内容由两部分构成:
分解的存在性;
分解的唯一性,即若不考虑排列的顺序,正整数分解为素数乘积的方式是唯一的。


既然是唯一的那么最后的答案就应该是质因子的乘积组成的和

这是用算数基本定理解决组合数问题的https://www.cnblogs.com/rhythmic/p/5846558.html

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define limit(a,b) memset(a,b,sizeof a)
const int N=5e5+7;
const int INF = 0x3f3f3f3f;
const int mod=1e6;
int cnt;
ll Init(ll n){
    int m=sqrt(n);
    ll ans=0;
    for(int i=2;i<=m;i++)//分解质因子
    {
        ll fac=1;
        while(n%i==0&&n>1){
            fac*=i;
            n/=i;
            }
            if(fac!=1)
            ans+=fac;
        if(n==1) break;
    }
    if(n>1)
        return ans+n;
    else
    return ans;
}
int main()
{
    ll n;
    #ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
    #endif // ONLINE_JUDGE
    int o=0;
    while(1){
        scanf("%lld",&n);
        if(n==0) break;
        printf("Case %d: ",++o);
        ll cnt=Init(n);
        if(cnt==0||cnt==n) {printf("%lld\n",n+1);continue;}//当cnt==n的时候时说明n是质数,那么答案就是n+1(本身和1)
        printf("%lld\n",cnt);
    }
     return 0;
}

猜你喜欢

转载自blog.csdn.net/c___c18/article/details/84191503