c++实现并优化:华小科是一名优秀的计算机科学家,她对于计算机编程和数学方程式有着深厚的理 解和研究。最近,她突然开始好奇复合函数对数的作用,具体来说,是研究同一函数与 自己复合后的新函数。现在她正在研究一个函数 f(X),其定义如下: f(X) = X M M | X X + 1 M ! X 其中,a | b 表示 a 整除 b,即 a 是 b 的因数,例如 2 | 4, 5 | 15;而 a ! b 表示 a 不 能整除 b,即 a 不是 b 的因数,例如 3 ! 4, 6 ! 8。 对于数 a,我们称 f(a) 为 1 次复合函数作用后的结果,f(f(a)) 为 2 次复合函数作 用后的结果,现在华小科想让你帮她解决一个简单的计算问题:给定 N,M,请问有多 少数 a 在经过 N 次复合函数作用后的结果为 1。
时间: 2024-02-05 09:03:22 浏览: 90
C++代码实现计算两个数的和并输出结果,还展示函数定义和调用的基本语法
优化算法的思路:对于每个数,我们可以通过它的因数来判断是否会在经过 n 次复合函数作用后的结果为 1。具体来说,我们只需要枚举所有小于等于 m 的因数,然后判断这些因数是否能够整除 n,如果能够整除,则说明这个数经过 n 次复合函数作用后的结果为 1。
下面是优化后的 C++ 代码实现:
```c++
#include <iostream>
#include <vector>
using namespace std;
// 计算 f(x) 的值
int f(int x, int m) {
if (x % m == 0)
return x / m;
else
return x + 1;
}
// 计算 n 次复合函数作用后的结果
int composite(int x, int n, int m) {
for (int i = 0; i < n; i++)
x = f(x, m);
return x;
}
// 获取一个数的因数
vector<int> get_factors(int x) {
vector<int> factors;
for (int i = 1; i * i <= x; i++) {
if (x % i == 0) {
factors.push_back(i);
if (i * i != x)
factors.push_back(x / i);
}
}
return factors;
}
int main() {
int n, m;
cin >> n >> m;
int count = 0;
vector<int> factors = get_factors(m);
for (int i = 1; i <= m; i++) {
bool is_one = true;
for (int j = 0; j < factors.size(); j++) {
if (composite(i, n / factors[j], m) == 1) {
is_one = false;
break;
}
}
if (is_one)
count++;
}
cout << count << endl;
return 0;
}
```
代码实现思路:
1. 定义函数 f(x, m) 计算 f(x) 的值;
2. 定义函数 composite(x, n, m) 计算 n 次复合函数作用后的结果;
3. 定义函数 get_factors(x) 获取一个数的因数;
4. 输入 n 和 m;
5. 获取 m 的所有因数;
6. 遍历 1 到 m 中的每一个数,如果经过 n/factors[j] 次复合函数作用后的结果为 1,则说明经过 n 次复合函数作用后的结果也为 1;
7. 如果存在一个因数能够保证经过 n 次复合函数作用后的结果不为 1,则这个数经过 n 次复合函数作用后的结果也不为 1;
8. 输出计数器的值。
这个算法的时间复杂度取决于获取每个数的因数的时间复杂度,这里使用了试除法,时间复杂度为 O(sqrt(m))。因此,总的时间复杂度为 O(m * sqrt(m))。对于较大的 m,这个算法仍然可能会超时,但比之前的算法要快很多。
阅读全文