[NOIP模拟赛]大整数的幂

17 篇文章 0 订阅
9 篇文章 0 订阅

题目描述

输入两个正整数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; 
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值