Description
包子和饺子在上数论课的时候,老师介绍一种有趣的数对,名曰:亲和数对。如果x和q称为亲和数对,则x的真因数之和等于q,且q的真因数之和等于x。(n的真因数是不包含n本身的所有因数)。比如(220,284)就是一组亲和数对。因为 220的所有非自身正因子之和为:1 + 2 + 4 + 5 + 10 + 11 + 20 + 22 + 44 + 55 + 110 = 284 284的所有非自身正因子之和为:1 + 2 + 4 + 71 + 142 = 220 包子和饺子觉得亲和数对很有意思,于是他俩想在众多亲和数对中找出一对来当作他们之间的密码,在网上聊天时,当包子说出其中一个亲和数时,饺子就回复另一个相应的亲和数,这样就知道饺子本人了。 但是他俩不知道哪两个数是亲和数对,所以希望知道某个区间中有多少个亲和数对,并且想知道他们分别是多少。
Input
只有两个正整数,A和B,表示包子和饺子希望知道在[A,B]这个区间内的亲和数。(1< = A < B < = 200000)
Output
第一行是一个整数k,表示[A,B]区间内有k组亲和数对。 接下来有k行,每行包括2个正整数Xi和Qi,(且Xi < Qi)。表示一个亲和数对。(并且要求Xi < Xi+1,即从小到大的顺序输出)
Sample Input
1 2000
Sample Output
2 220 284 1184 1210
代码:
从样例看出来1-2000的亲合数才有2对;
而且最大n为200000,算因子和的情况下暴力肯定会超时...
//下面是打表过的程序: //全部打表还32MS ... #include <stdio.h> #include <string.h> #include <iostream> using namespace std; #define N 20 int f[N]={220,1184,2620,5020,6232,10744,12285,17296,63020,66928, 67095,69615,79750,100485,122265,122368,141664,142310,171856,176272}; int f1[N]={284,1210,2924,5564,6368,10856,14595,18416,76084,66992, 71145,87633,88730,124155,139815,123152,153176,168730,176336,180848}; int main() { //这题因为全部的结果总数最多为20个,所以直接暴力打表出来了。 int i,num,x,y;num=0; scanf("%d %d",&x,&y); for(i=0;i<20;i++) if(f[i]>=x && f1[i]<=y) num++; printf("%d\n",num); for(i=0;i<20;i++) if(f[i]>=x && f1[i]<=y) printf("%d %d\n",f[i],f1[i]); return 0; }