Codeforces Round #520 (Div. 2) B math(素數因子的應用)
阿新 • • 發佈:2018-11-15
給出一個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; } } }