题目描述
输入两个正整数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; }
[NOIP模拟赛]大整数的幂
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.