zoukankan      html  css  js  c++  java
  • Codeforces Round #520 (Div. 2) B math(素数因子的应用)

    题意:

    给出一个n ; 

    有两个操作: 1,mul A   ,   n=n*A   ; 2,sqrt()  ,  n=sqrt(n)  开更出来必须是整数 ;

    求出经过这些操作后得出的最小  n , 和最小操作数;

    分析:首先得明确知道分解到怎样的时候才是 得出最小的n , 首先进过手画就可以明明,经过分解n 可以发现它的素数因子是不可以被开根去的 , 无论怎么相乘开根的结果总是留在的 , 好那这到题的MIN(n) = (本身所有的素数因子的鸡) ; 

    那操作数怎么求呢? 

    首先我们只需要一次的相乘把它化简为完美状态(完美状态是指,所有的素数因子的个数相同);

    那剩下的直接开根就好,完美AC

    #include<bits/stdc++.h>
    using namespace std;
    
    int main()
    {
        int n;
        scanf("%d",&n);
        if(n==1)
        {
            printf("1 0
    ");
            return 0;
        }
        int MAX,MIN,W;
       MAX=0;
       MIN=0x3f3f3f3f;
       W=1;
       for(int i=2 ; i*i<=n ; i++)///找到素数因子
       {
           if(n%i==0)
           {
               int cnt=0;  ///记录当前素数因子的个数
               W*=i;       ///最终的为所有的素数因子的鸡
               while(n%i==0)
               {
                   n/=i;
                   cnt++;
               }
               MAX=max(MAX,cnt);
               MIN=min(MIN,cnt);
               if(n==1)
               break;
           }
       }
       if(n>1)
       {
           MAX=max(MAX,1);
           MIN=min(MIN,1);
           W*=n;
       }
       printf("%d ",W);
       int num=0;
       for(int i=0 ; i<=60 ; i++)
       {
           if((1<<i) >=MAX)
           {
               int num=i;
               if(MIN==(1<<i))
               {
                   
               }
               else 
                num++;///if最小因子的个数与最大的不一样就要进过乘机的运算了
               printf("%d",num);
               break;
           }
       }
    }
  • 相关阅读:
    MacOS的多重启动工具
    exchange 2003配置ASSP 反垃圾邮件
    VMWARE workstation 9 收缩虚拟硬盘
    [AX2012]在SSRS报表中获取从Menuitem传入的记录
    [AX2012]代码更改默认财务维度
    js使用模板快速填充数据
    CI框架--事务
    $().each 和表单事件的坑
    基于layerpage 前后端异步分页
    SQL 语句格式
  • 原文地址:https://www.cnblogs.com/shuaihui520/p/9965629.html
Copyright © 2011-2022 走看看