整除的数学表示:n|x

首先先了解一下除法:\frac{a}{b},a称为被除数,b是除数

整除是指整数a除以自然数b除得的商正好是整数而余数是零.即\frac{a}{b}=c...0,表示余数为0

我们就说a能被b整除(或说b能整除a),记作b|a,读作“b整除a”或“a能被b整除”.

所以的:

n|x   说明是n整除x,也就是x能被n整除,说明x是被除数n是除数

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
优化算法的思路:对于每个数,我们可以通过它的因数来判断是否会在经过 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,这个算法仍然可能会超时,但比之前的算法要快很多。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值