题解 | 亲和数

亲和数

https://www.nowcoder.com/practice/86e1cf1801974480b9c96c88ff055979

#include<bits/stdc++.h>
using namespace std;

int main() {
    int n;
    cin >> n;
    int maxr = 0; //记录最大的数,规定保存真因子之和的数组
    vector< pair<int, int> > arr; //保存区间
    for (int i = 0; i < n; i++) {
        int l, r;
        cin >> l >> r;
        arr.push_back({l, r});
        if (r >= maxr)
            maxr = r;
    }
    vector<int> sum(maxr + 1, 0); //保存真因子之和,相当于空间换时间判断x是否为亲和数(有点巧妙)
    for (int i = 1; i <= maxr; i++) {
        for (int j = i * 2; j <= maxr; j += i) { 
            	sum[j] += i;
        }
    }

    for (int i = 0; i < arr.size(); i++) {
    	if (arr[i].first>arr[i].second){ //这个算是测试样例的坑,测试点有l>r的情况,要输出No,搞了半天才发现,题目压根没说!
    		cout << "No" << endl;
    		continue;
		}
        bool flag = true;
        for (int j = arr[i].first; j <= arr[i].second; j++) {
            if (sum[j] <= maxr && j!=sum[j] && sum[sum[j]] == j) { //判断x是否为亲和数,注意x和y不能相等(x=j,y=sum[j]),算是题目的坑了
                cout << j << endl;
                flag = false;
                break;
            }
        }
        if (flag)
            cout << "No" << endl;
    }


}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务