Time Limit: 3 second
Memory Limit: 2 MB
【问题描述】
某一天,tenshi看了一本趣味数学书,上面提到了亲和数:定义数对(x,y)为亲和数对当且仅仅当x、y为不同 正整数,且x、y各自的所有非自身正因子之和等于另一个数。 例如 (220,284)是亲和数对,因为: 220的所有非自身正因子之和为:1 + 2 + 4 + 5 + 10 + 11 + 20 + 22 + 44 + 55 + 110 = 284 284的所有非自身正因子之和为:1 + 2 + 4 + 71 + 142 = 220 数对 (x,y) 跟 (y,x) 被认为是同一数对,所以我们只考虑x, tenshi对某个范围内的亲和数对的数量非常感 兴趣,所以希望你能帮她编写一个程序计算给定范围内的亲和数对的数量。给定一个范围A到B,如果A≤x≤B,则 我们称 (x,y)在范围[A,B]内的亲和数对。
【输入】
从输入文件第一行分别读入正整数A和B,其中A、B满足1 ≤ A ≤ B ≤ 108 且 B-A ≤ 105
【输出】
输出文件只有一行,就是[A,B]内亲和数对的数量
【输入样例】
200 250【输出样例】
1
【题解】
按照题目的要求,可以做一个函数 专门用来计算某个数的所有因数之和。计算量会很大,但是题目真正的数据给的很小。所以能过。
因为重复的不算,还要判重。不过已知的亲和数对并不多,所以没差。
【代码】
#include <cstdio>
const int MAXN = 1000;
int A,B,ans = 0,shudui[MAXN];
void input_data()
{
scanf("%d %d",&A,&B);
}
int get_h(int x) //获取x的所有因数之和
{
int tt = 0;
for (int i = 1;i <= x-1;i++)
if ( ( x % i) == 0)
tt+=i;
return tt;
}
void get_ans()
{
for (int i = A;i <= B;i++) //从A到B枚举
{
int temp = get_h(i); //获取i的所有因数之和
if ( temp !=i )
{
int temp2 = get_h(temp); //再获取和的因数之和 嵌套。
if (temp2 == i) //如果两个因数之和等于对方 那么久尝试增加答案。
{
bool flag = true;
for (int j = 1;j <= ans;j++) //尝试之前先找找看有没有重复。
if (shudui[j] == temp || shudui[j] == temp2)
{
flag = false;
break;
}
if (flag) //没有重复则增加答案。同时记录方案。
shudui[++ans] = temp;
}
}
}
}
void output_ans()
{
printf("%d\n",ans);
}
int main()
{
input_data();
get_ans();
output_ans();
return 0;
}