nyoj 411-Friends number

http://acm.nyist.net/JudgeOnline/problem.php?pid=411

英文题目大概意思就是:a的因子和等于b,b的因子和等于a;然后题目给出范围,求在这范围里面有多少这样的数对。

首先是打表的方法。打到500000就够了。

#include<iostream>
using namespace std;
int a[28] = {220,1184,2620,5020,6232,10744,12285,17296,66928,
            67095,63020,69615,79750,122368,100485,122265,141664,142310,
              171856,176272,196724,185368,280540,308620,356408,319550,437456,469028};
int b[28] = {284,1210,2924,5564,6368,10856,14595,18416,66992,
            71145,76084,87633,88730,123152,124155,139815,153176,168730,
              176336,180848,202444,203432,365084,389924,399592,430402,455344,486178};  
int main() {
  int n, l;
  while (cin >> n >> l) {
    int sum = 0;
    for (int i = 0; i < 28; i++) {
      if (a[i] >= n && b[i] <= l)
        sum++;
    }
    cout << sum << endl;
  }
}        

然后是老师的一种方法,一种很好的求因子和的方法:

#include<iostream>
#include<map>
using namespace std;
int const MAX = 5000000;
int a[MAX];
int main() {
  for (int i = 2; i <= MAX; i++) a[i] = 1;
  for (int i = 2; i * i <= MAX; i++) //因子求和 
    for (int j = i; j * i <= MAX; j++)
      a[i * j] += i + j;  
              
  map<int, int> mp;
  for (int i = 1; i <= MAX; i++) {
    int t = a[i];
    if (t > i && t <= MAX && a[t] == i) 
      mp[i] = t;
  } 
  int m, n;
  while (cin >> m >> n) {
    int count = 0;
    map<int, int>::iterator p;
    for (p = mp.begin(); p != mp.end(); p++)
      if (p->first >= m && p->second <= n) count++;
    cout << count << endl;
  }
  
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值