10791 - Minimum Sum LCM

来源:互联网 发布:java定义可变长度数组 编辑:程序博客网 时间:2024/06/11 05:11

唯一分解定律的应用,任何数都能分解成几个质数相乘的形式,那个质数部分说明了这个质数出现的次数。所以用while()循环来求得各个质数。用k来得出每个小部分。注意到有可能这个数会被一个小质数给除尽,例如n=4,则答案要+1=5

#include<bits/stdc++.h>using namespace std;typedef long long LL;const int ans = 100000;int vis[ans+5];vector<int> primes;void add_primes() {    int m=sqrt(ans+0.5);    memset(vis,0,sizeof(vis));    for(int i=2;i<=m;++i) if(!vis[i])        for(int j=i*i;j<=ans;j+=i)        vis[j] = 1;    for(int i=2;i<=ans;i++)        if(!vis[i]) primes.push_back(i);}void solve(LL n,LL& maxn) {    long long bns=n;    int k,bbs=0;    for(int i=0;primes[i]<sqrt(bns+0.5);++i){        k=1;        while(n%primes[i]==0) {            n/=primes[i];            k*=primes[i];        }        if(k!=1) {            maxn+=k; bbs++;        }        if(n==1) break;    }    if(n!=1&&n!=bns) maxn+=n;    if(n==bns) { maxn=bns+1;return ; }    if(bbs==1&&n==1) maxn++;}int main() {    int kase=0;    add_primes();    LL n;    while(scanf("%lld",&n)!=EOF&&n) {        LL maxn=0;        solve(n,maxn);        printf("Case %d: %lld\n",++kase,maxn);    }    return 0;}


0 0
原创粉丝点击