[NOIP模擬賽]大整數的冪

題目描述

輸入兩個正整數A,B。

你有一個數字X,X初始爲1。每次你可以對X進行以下兩種操作之一:

給X乘上一個任意的質數P

給X乘上它目前的一個因子d

輸出將X變成A^B所需要的最少操作次數


輸入格式

第一行:一個整數,表示A(2≤A≤10^6)

第二行:一個整數,表示B(1≤A≤10^6)


輸出格式

第一行:一個整數,表示答案


輸入樣例

162

1


輸出樣例

4


樣例解釋

操作1:p=3,x=1*3=3

操作1:p=3,x=3*3=9

操作2:d=9,x=9*9=81

操作1:p=2,x=81*2=162



題解

首先,A中有x個質因子,就至少操作x次。

然後,質因子中最高次冪c爲多少,就還要操作log2c次,參考快速冪。


#include<cstdio> 
#include<cmath> 
#include<algorithm> 
using namespace std;

const int N=1e6+10; 
int A, B, psum, maxc; 
struct node{ int v, cnt; }p[N]; 

void Divi( int n ) { 
    int m=sqrt(n); 
    for( int i=2; i<=m; i++ ) 
        if( !( n%i ) ) { 
            p[++psum].v=i; 
            while( !( n%i ) ) p[psum].cnt++, n/=i; 
            maxc=max( maxc, p[psum].cnt ); 
        } 
    if( n>1 ) { 
        p[++psum].v=n, p[psum].cnt++; 
        maxc=max( maxc, p[psum].cnt ); 
    } 
} 
  
int Sum() { 
    maxc*=B; 
    int res=1, ans=0; 
    while( res<maxc ) res*=2, ans++; 
    return ans; 
} 
  
int main() {
    scanf( "%d%d", &A, &B );
    Divi(A); 
    printf( "%d\n", psum+Sum() ); 
    return 0; 
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章