[NOIP模拟赛]大整数的幂

来源:互联网 发布:已备案域名已删除 编辑:程序博客网 时间:2024/05/17 21:58

题目描述

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


原创粉丝点击