查找在C ++中将N减少到1的最大操作
概念
对于给定的两个数P和Q(P和Q可以高达10 ^ 6),这形成一个数N =(P!/ Q!)。我们的任务是通过执行尽可能多的操作将N减少到1。请记住,在每个操作中,如果N可被X整除,则可以用N / X替换N。确定可以进行的最大操作数。
输入值
A = 7, B = 4
输出结果
4
说明
N是210,除数是2、3、5、7
输入值
A = 3, B = 1
输出结果
2
说明
N是6,除数是2,3。
方法
已经观察到数P!/ Q!的因式分解。这与(Q + 1)*(Q + 2)*…*(P – 1)* P的因式分解相同。
还应注意,如果仅将N除以其主要因子,则运算次数将最大。因此,换句话说,我们需要确定N的素数也包括重复项的数量。
假设对从2到1000000的每个数字进行因子分解,计算素数的数量。
首先,使用Eratosthenes的Sieve来确定每个数字的质数。
建立一个从2到N的连续整数列表:(2,3,4,…,N)。
首先,假设p等于2,即第一个质数。
从p ^ 2开始,以p的增量递增,并在列表中指示这些大于或等于p ^ 2的数字。因此,这些数字可以是p(p + 1),p(p + 2),p(p + 3)等。
在列表中确定第一个大于p的数字(未指定)。已经看到如果没有这样的数字,则停止。否则,假设p现在等于该数字(表示下一个质数),然后再次从步骤3开始重复。
在实施Eratosthenes的Sieve方法之后,我们可以在实施以下公式的因式分解中计算素数的数量-
primefactors [num] = primefactors [num / primedivisor [num]] + 1目前,可以为素数因子实现前缀和数组,然后在区间[P,Q]上求和。
示例
// CPP program to find maximum//可以移动号码
#include <bits/stdc++.h>
using namespace std;
#define N 1000005
//用于存储素数
//每个数字的因素
int primeFactors1[N];
//显示查找素数的功能
//每个数字的因素
void findPrimeFactors(){
for (int a = 2; a < N; a++)
//现在,如果a是质数
if (primeFactors1[a] == 0)
for (int b = a; b < N; b += a)
//将值增加一
//简直是倍数
primeFactors1[b] = primeFactors1[b / a] + 1;
//构建前缀总和
//有帮助
//多个测试用例
for (int a = 1; a < N; a++)
primeFactors1[a] += primeFactors1[a - 1];
}
//驱动程式码
int main(){
//创建primeFactors1数组
findPrimeFactors();
int P = 7, Q = 4;
//必填
cout << primeFactors1[P] - primeFactors1[Q];
return 0;
}
输出结果
4
以上是 查找在C ++中将N减少到1的最大操作 的全部内容, 来源链接: utcz.com/z/345358.html