问题 I: 亲和数
时间限制: 1 Sec 内存限制: 128 MB
题目描述
两个正整数中,彼此的全部约数之和(本身除外)与另一方相等,则称这两数为亲和数。
例如,220和284就互为亲和数。
输入
输入不超过1000行数字,每行一个正整数n(1 < n <= 106)。
输出
输出[1,n]中有亲和数对的数目。
样例输入
250
300
样例输出
0
1
思路
预处理大概需要1s多一点,如果时限开到2s就可以不用打表
注:打表程序是把原先被注释的代码注释起来。原先没被注释的代码注释了
#include <bits/stdc++.h>
using namespace std;
// 2022 OneWan
// int sum[1000001], ans[1000001];
int main() {
// freopen("biaozi.txt", "w", stdout);
// for (int i = 2 ; i <= 1000000 ; ++i) {
// sum[i] = 1;
// for (int j = 2 ; j * j <= i; ++j) {
// if (i % j == 0) {
// sum[i] += j;
// int k = i / j;
// if (j != k) sum[i] += k;
// }
// }
// }
// for (int i = 2 ; i <= 1000000 ; ++i) {
// int a = sum[i];
// if (a >= 1000000) continue;
// if (i == a) continue;
// if (i == sum[a]) {
// ++ans[max(i, a)];
// }
// }
// ans[1] = 0;
// for (int i = 2 ; i <= 1000000 ; ++i) ans[i] += ans[i - 1];
// int temp = 0;
// for (int i = 2 ; i <= 1000000 ; ++i) {
// if (ans[i] != temp) {
// printf(", %d", i);
// }
// temp = ans[i];
// }
int a[] = {284, 1210, 2924, 5564, 6368, 10856, 14595, 18416, 66992, 71145, 76084, 87633, 88730, 123152, 124155, 139815, 153176, 168730, 176336, 180848, 202444, 203432, 365084, 389924, 399592, 430402, 455344, 486178, 514736, 525915, 652664, 669688, 686072, 691256, 712216, 783556, 796696, 863835, 901424, 980984};
int t;
while (scanf("%d", &t) != EOF) {
int ans;
for (ans = 0 ; t >= a[ans] ; ++ans);
printf("%d\n", ans);
}
return 0;
}
/**************************************************************
Problem: 2286
User: 21XXXXXXXX
Language: C++
Result: 正确
Time:0 ms
Memory:2024 kb
****************************************************************/