69,371
社区成员
发帖
与我相关
我的任务
分享
#include<iostream>
#include<string>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long LL;
int factor[1010]; // 因子
int sum, cnt; // 因子的和,因子的个数
int subset; // 子集和,可以用sum代替
bool isYingshu(int num) {
// 拆分一个数num,然后因子存入factor[],并返回是不是盈数
cnt = 0, sum = 0;
factor[cnt++] = 1; sum += 1; // 1 肯定是因子
for (int i = 2; i*i <= num; i++) {
if (num % i == 0) {
factor[cnt++] = i; sum += i;
factor[cnt++] = num / i; sum += (num / i);
if (i*i == num) { // 多算了一个
cnt--; sum -= i;
}
}
}
if (sum <= num) return false;
else return true;
}
bool isStrange(int num) {
// 返回是不是奇怪数
if (!isYingshu(num)) return false;
LL len = ((LL)1 << cnt); // 总共的子集情况
for (LL i = 0; i < len; i++) {
subset = 0;
for (LL j = 0; j < cnt; j++) {
if (i & ((LL)1 << j)) subset += factor[j];
}
if (subset == num) return false;
}
return true;
}
int main() {
for (int i = 70; i <= 1000; i++) {
if (isStrange(i)) {
printf("该数%d,因子个数%d\n", i,cnt);
}
}
return 0;
}