1243-[008]包子和饺子的密码

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;
}

 

转载于:https://www.cnblogs.com/songacm/p/3432491.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值