列表

详情


NC25134. [USACO 2006 Ope B]Bedtime Reading, II

描述

求在给定区间[start,end]内所有的亲和数对。
亲和数的定义:对于数对(A,B),如果A的除了自己外的所有约数的和等于B,并且B的所有除了自己外的所有约数的和等于A,那么就称(A,B)为一组亲和数。
如果A=B,只需输出A即可,否则按照其中较小的一个数为第一关键字排序输出。

输入描述

Line 1: Two space-separated integers: start and end (1 <= start <= end <= 500000)

输出描述

Lines 1..?: Each line contains a space-separated list that represents one chain of numbers calculated using the described bess() function.

示例1

输入:

200 1200

输出:

220 284
496
1184 1210

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 37ms, 内存消耗: 4332K, 提交时间: 2019-06-15 11:37:20

#include<iostream>
using namespace std;
long long sum[5000100];
int main()
{
    for(int i=1;i<=500000;++i)
        for(int j=i+i;j<=500000;j+=i)
            sum[j]+=i;
    int a,b;
    cin>>a>>b;
    for(int i=a;i<=b;++i)
        if(sum[i]>=i&&sum[sum[i]]==i)
        {
            if(sum[i]==i)
                cout<<i<<endl;
            else
                cout<<i<<" "<<sum[i]<<endl;
        }
    return 0;
}

C++(clang++11) 解法, 执行用时: 15ms, 内存消耗: 2424K, 提交时间: 2021-02-08 19:58:15

#include<bits/stdc++.h>
using namespace std;
int s[500010];
int l,r;
void work()
{
	for(int i=1;i<=500000;i++)
	{
		for(int j=i+i;j<=500000;j+=i)
		s[j]+=i;
	}
}
int main()
{
	work();
	cin>>l>>r;
	for(int i=l;i<=r;i++)
	{
		int j=s[i];
		if(i<=500000&&j<=500000&&i<=j&&s[j]==i)
		{
			if(i!=j)
			cout<<i<<' '<<j<<endl;
			else
			cout<<i<<endl;
		}
	}
	return 0;
}

上一题