好朋友
题目背景
小可可和所有其他同学的手腕上都戴有一个射频识别序列号码牌,这样老师就可以方便的计算出他们的人数。很多同学都有一个“好朋友” 。如果 A A A 的序列号的约数之和恰好等于 B B B 的序列号,那么 A A A 的好朋友就是 B B B。在这里,一个数的约数不包括这个数本身。因为一些同学的号码约数和大于其他任何同学的号码,所以这些同学没有好朋友。一些同学有一个“非常好友” 。当两个同学互为“好朋友”时,他们就是一对“非常好友” 。注意在这道题中,忽略那些自己是自己的“非常好友”的情况。
题目描述
给定一个序列号 s s s,找出序列号不小于 s s s 的第一对“非常好友” 。
输入格式
只有一行一个整数 s s s,即给定的序列号下界。
输出格式
输出一行两个用空格隔开的整数 a a a 和 b b b。
a a a 表示第一个序列号不小于 s s s 的有“非常好友”的同学, b b b 是 a a a 的“非常好友” 。(注:允许 b < s b<s b<s)
样例 #1
样例输入 #1
206
样例输出 #1
220 284
提示说明
数据规模与约定
- 对于 100 % 100\% 100% 的数据,保证 6 ≤ s ≤ 1.8 × 1 0 4 6\le s\le1.8\times10^4 6≤s≤1.8×104。
代码内容
// #include <iostream>
// #include <algorithm>
// #include <cstring>
// #include <stack>//栈
// #include <deque>//堆/优先队列
// #include <queue>//队列
// #include <map>//映射
// #include <unordered_map>//哈希表
// #include <vector>//容器,存数组的数,表数组的长度
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll sh(ll x) //计算x的约数之和
{
ll ans=0;
for(ll i=1;i<x;i++)
{
if(x%i==0)
ans+=i;
}
return ans;
}
int main()
{
ll s;
cin>>s;
for(ll i=s;;i++) //从s开始判断i是否为s的非常好友
{
ll t=sh(i);
if(sh(t)==i&&i!=t) //判断i的约数之和与s相等
{
cout<<i<<" "<<t<<endl;
return 0;
}
}
return 0;
}