http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1520
好题,又学习了一种方法.
此题只要建一个表,里面放上它的所有因数就可以了.
新建一个因数表并打印1到500的每个数的因数:
/* * 分解因数.cpp * * Created on: Apr 6, 2010 * Author: wyy * 分解因数. */ #define SIZE 501 #include<iostream> #include<vector> using namespace std; int main() { //freopen("input.txt", "r", stdin); vector< vector<int> > vec(SIZE); for(int k = 1; k != SIZE; ++k) vec[k].push_back(1); for(int i = 2; i != SIZE / 2; ++i) { int j = 2 * i; while(j < SIZE) { vec[j].push_back(i); j += i; } } for(int k = 2; k != SIZE; ++k) vec[k].push_back(k); for(int k = 1; k != SIZE; ++k) { cout << k << " : "; for(vector<int>::iterator iter = vec[k].begin(); iter != vec[k].end(); ++iter) cout << *iter << " "; cout << endl; } //fclose(stdin); return 0; }
将因数表中的每个数的每个因数相加(题目中说除了1和本身.所以上面的程序再删除几句代码就可以了),并放到一个数组sum里面
然后判断sum[sum[i]] == i 是否成立就可以了.
好了,贴上代码:
/* * 2520.cpp * * Created on: Apr 5, 2010 * Author: wyy * */ #include<iostream> #include<vector> using namespace std; struct Pairs { int x; int y; }; const int SIZE = 8000000; const int NUM = 6000000; int sum[SIZE]; int main() { for (int i = 2; i != NUM; i++) sum[i] = 1; for(int i = 2; i != NUM / 2; ++i) { int x = 2 * i; while(x < NUM) { sum[x] += i; x += i; } } Pairs P; vector<Pairs> vec; for(int i = 220; i != NUM; ++i) { if(sum[i] > i && sum[i] < SIZE && sum[sum[i]] == i) { P.x = i; P.y = sum[i]; vec.push_back(P); } } //freopen("input.txt", "r", stdin); int k; while(cin >> k) cout << vec[k - 1].x << " " << vec[k - 1].y << endl; return 0; }