如果有一个正整数N,能被2520整除,则N就是完美数。 现有一个非常大的正整数M,最高位为1,其余均为0,请计算在[1,M]范围内有多少个完美数。 输入:输入一个正整数M 输出:完美数的个数 样例输入1:10000 样例输出1:3 样例输入2:1000000 样例输出2:396 提示:数据范围 前4个测试数据,1⩽ M⩽10的18次方 所有的测试数据,1⩽ M⩽10的1000次方 C++代码实现
时间: 2024-02-03 15:13:22 浏览: 60
由于M非常大,直接枚举[1,M]范围内的所有数显然不可行。但是我们可以观察到2520是一个比较小的数,因此我们可以考虑枚举2520的倍数,然后再判断是否满足完美数的条件。具体实现可以参考下面的C++代码:
```c++
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 25;
const long long MAXM = 1e18;
int cnt;
long long ans[MAXN], M;
long long gcd(long long x, long long y) {
return y == 0 ? x : gcd(y, x % y);
}
long long lcm(long long x, long long y) {
return x / gcd(x, y) * y;
}
void dfs(int dep, long long cur) {
if (cur > M) return;
ans[++cnt] = cur;
for (int i = dep; i <= 7; ++i) {
if (cur > MAXM / 2520) break;
cur = lcm(cur, i * 2520);
dfs(i + 1, cur);
}
}
int main() {
cin >> M;
dfs(1, 2520);
long long res = 0;
for (int i = 1; i <= cnt; ++i) {
res += M / ans[i];
}
cout << res << endl;
return 0;
}
```
这里的dfs函数用于求解所有的2520的倍数,具体实现采用递归的方式。注意,由于M非常大,我们需要使用long long类型。同时,在计算完美数的个数时,由于2520的倍数可能会重复计算,因此需要使用容斥原理,去掉重复的部分。
阅读全文