这题k的大小没说,吓到我了.
看了报告才直到最多不超过21
做法可以用类似筛选法的方法把每个数的和算出来.
然后如果i== tb[tb[i]] 说明是一对亲和数.
注意一些边界条件,比如 tb[i] 要小于数组大小,i 要小于tb[i]
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 210000;
int tb[maxn];
int ans[85][2];
void init(){
for(int i = 1; i < maxn; ++i)tb[i] = 1;
for(int i = 2; i <= maxn / 2; ++i){
for(int j = i + i; j< maxn; j += i){
tb[j] += i;
}
}
int idx = 1;
for(int i = 220; i < maxn; ++i){
if( i < tb[i] && tb[i] < maxn&& tb[tb[i]] == i){
ans[idx][0] = i;
ans[idx++][1] = tb[i];
}
}
}
int main(){
init();
int k;
while(scanf("%d", &k) == 1){
printf("%d %d\n", ans[k][0], ans[k][1]);
}
return 0;
}