1. 程式人生 > >Codeforces Round #520 (Div. 2) B math(素數因子的應用)

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; } } }