亲和数。在好玩的数学上看过耶~
就是比如220的因子和(不带它本身)为284,而284的因子和是220,这就是一对亲和数~
以前不明确题目中的k就没敢做。
今天见SK空间里有这题,暴力了,那我也暴吧 = =。。
方法不好,跑了十几秒才跑出来10几对 = =。。。才10W以内。
搜的方法用的类似筛法的方法好神奇啊~!
这个代码跑表。。。
#include <cstdio> #include <cstdlib> #include <iostream> #include <string.h> #include <queue> #include <limits.h> #include <math.h> #define BEG 2 #define MAX 6000100 using namespace std; int num[MAX]; int qinnum[MAX][2],cou; void init() { int i,k; for(i=0; i<MAX; i++) num[i] = 1; for(i=BEG; i<MAX; i++) { k = i+i; while( k < MAX ) // magic~~ { num[k] += i; k += i; } } cou = 1; for(i=BEG; i<MAX; i++) if( num[i] < MAX && num[num[i]] == i && i < num[i] ) { qinnum[cou][0] = i; qinnum[cou++][1] = num[i]; } } int main() { int n; freopen("out.txt","w",stdout); init(); cout << cou << endl; for(int i=1; i<cou; i++) cout << qinnum[i][0] << ',' << qinnum[i][1] << ','; return 0; }
这个打表
#include <cstdio> #include <cstdlib> #include <iostream> #include <string.h> #include <queue> #include <limits.h> using namespace std; int num[81][2] = {0,0,220,284,1184,1210,2620,2924,5020,5564,6232,6368,10744, 10856,12285,14595,17296,18416,63020,76084,66928,66992,67095, 71145,69615,87633,79750,88730,100485,124155,122265,139815, 122368,123152,141664,153176,142310,168730,171856,176336,176272, 180848,185368,203432,196724,202444,280540,365084,308620,389924, 319550,430402,356408,399592,437456,455344,469028,486178,503056, 514736,522405,525915,600392,669688,609928,686072,624184,691256, 635624,712216,643336,652664,667964,783556,726104,796696,802725, 863835,879712,901424,898216,980984,947835,1125765,998104,1043096, 1077890,1099390,1154450,1189150,1156870,1292570,1175265,1438983, 1185376,1286744,1280565,1340235,1328470,1483850,1358595,1486845, 1392368,1464592,1466150,1747930,1468324,1749212,1511930,1598470, 1669910,2062570,1798875,1870245,2082464,2090656,2236570,2429030, 2652728,2941672,2723792,2874064,2728726,3077354,2739704,2928136, 2802416,2947216,2803580,3716164,3276856,3721544,3606850,3892670, 3786904,4300136,3805264,4006736,4238984,4314616,4246130,4488910, 4259750,4445050,4482765,5120595,4604776,5162744,5123090,5504110, 5147032,5843048,5232010,5799542,5357625,5684679,5385310,5812130, 5459176,5495264,}; int main() { int n; while( ~scanf("%d",&n) ) { printf("%d %d/n",num[n][0],num[n][1]); } return 0; }