zoukankan      html  css  js  c++  java
  • Minimum Sum LCM(uva10791+和最小的LCM+推理)

    L - Minimum Sum LCM
    Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu
     

     

    题意:输入正整数n,<注意n=2^31-1是素数。结果是2^31已经超int。用long long,>找至少两个数,使得他们的LCM为n且要输出最小的和;

     

    思路:既然LCM是n,那么一定是n的质因子组成的数,又要使和最小,那么就是ans+=[质因子]^[个数]+...;

     

    之前我一直超时,感觉都无语了。

     

    转载请注明出处:寻找&星空の孩子 

     

    题目链接:UVA 10791  

     

    也欢迎来我开的专题刷题。

    哈哈http://acm.hust.edu.cn/vjudge/contest/view.action?cid=77956#overview

     

    AC代码:

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<math.h>
    using namespace std;
    #define LL long long
    
    LL n,sum;
    
    inline LL divisor(LL x)
    {
        int t=0,cnt;
        LL tp;
        for(int i=2; i<=sqrt(n); i++)
        {
            cnt=0;
            tp=1;
            if(x%i==0&&i!=n)
            {
                while(x)
                {
                    if(x%i==0)
                    {
                        cnt++;
                        x=x/i;
                        tp=tp*i;
                    }
                    else {sum+=tp;break;}
                }
                t++;
            }
            if(!x) break;
        }
        if(x>1){sum+=x;t++;}
     //   printf("sum=%lld
    ",sum);
        return t;
    }
    
    int main()
    {
    
        int ca=1;
        while(scanf("%lld",&n),n)
        {
            sum=0;
            LL m=divisor(n);
            if(sum==0||m==1)sum=n+1;
            printf("Case %d: %lld
    ",ca++,sum);
        }
        return 0;
    }


     

    超时代码:

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    #define LL long long
    
    LL n,sum;
    
    inline LL divisor(LL x)
    {
        int t=0,cnt;
        LL tp;
        for(int i=2; i<=x; i++)//这么写,就超时 了。。。。。
        {
            cnt=0;
            tp=1;
            if(x%i==0&&i!=n)
            {
                while(x)
                {
                    if(x%i==0)
                    {
                        cnt++;
                        x=x/i;
                        tp=tp*i;
                    }
                    else {sum+=tp;break;}
                }
                t++;
            }
            if(!x) break;
        }
        return t;
    }
    
    int main()
    {
    
        int ca=1;
        while(scanf("%lld",&n),n)
        {
            sum=0;
            LL m=divisor(n);
            if(sum==0||m==1)sum=n+1;
            printf("Case %d: %lld
    ",ca++,sum);
        }
        return 0;
    }


     

     

     

  • 相关阅读:
    [luogu p1996] 约瑟夫问题
    [luogu p1098] 字符串的展开
    [luogu p1035] 级数求和
    [luogu p1004] 方格取数
    [luogu p3383]【模板】线性筛素数
    [luogu p1223] 排队接水
    [luogu p1002] 过河卒
    [luogu p1001] A+B Problem
    Java BIO/NIO(Non-blocking I/O)详解
    Linux页框&伙伴算法以及slab机制
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5097725.html
Copyright © 2011-2022 走看看