1. 程式人生 > >Codeforces Round #520 (Div. 2)B(貪心,數學)

Codeforces Round #520 (Div. 2)B(貪心,數學)

#include<bits/stdc++.h>
using namespace std;
int mi[100007];
int main(){
int cnt=0;
int flag=0;
int ans=1;
int n,k=0;
scanf("%d",&n);
for(int i=2;i*i<=n;i++){
  if(n%i==0){
    flag=1;
    break;
  }
}
if(flag==0)//如果不用操作直接輸出即可
printf("%d %d",n,k);
else{
  for(int i=2;i*i<=n;i++){
    if(n%i==0){
      ans*=i;//有小到大尋找可分解的因數


      cnt++;
      while(n%i==0){
        n/=i;
        mi[cnt]++;//記錄能被分解幾次
      }
    }
  }
  if(n>1){//剩餘大於根號n的仍未分解
    cnt++;
    mi[cnt]++;
    ans*=n;//記錄在案,ans是由無法繼續分解的數相乘組成的
  }
  int mx=0;
  for(int i=1;i<=cnt;i++)
    mx=max(mx,mi[i]);//找到能被操作次數最多的
  k=(int)ceil(log(mx*1.0)/log(2.0));//開方次數
  int x=pow(2,k);//實際操作的最大值

  for(int i=1;i<=cnt;i++)
    if(mi[i]!=x){//不理想的情況(不用乘直接開方)是需要乘一次的,貪心地乘一次直接把所有數組裡的值由哪些數得來的乘到陣列值變為x
      k++;//多出一次乘法操作
      break;
    }
    printf("%d %d",ans,k);
  }
  return 0;
}