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