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\n");
        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;
       }
   }
}

猜你喜欢

转载自www.cnblogs.com/shuaihui520/p/9965629.html