题目描述
给N(1<=N<=30)个正整数,好奇的小明想知道这N个正整数的乘积,是否可以将其分解为2个正整数a和b的乘积,并且a的约数个数与b的约数个数之差为 1 个
输入
第一行为一个整数 n 。 第 2∼n+1 行为给出的n个正整数。 (输入数据保证存在唯一解)
输出
输出包含两行。 第一行输出 a 和 a 的约数个数。 第二行输出 b 和 b 的约数个数。 输出保证 a 的约数个数大于 b 的约数个数。
样例输入复制
2 1 2800
样例输出复制
175 6 16 5
提示
测试数据在 long long 范围内。
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
map<long long, long long> m;
void func(long long n)
{
m[n] = 0;
for (int i = 1; i <= n; i++)
{
if (n % i == 0)m[n]++;
}
}
int main()
{
long long n;
cin >> n;
long long sum = 1;
long long x;
for (int i = 1; i <= n; i++)
{
cin >> x;
sum *= x;
}
for (int i = 1; i <= sum / i; i++)
{
if (sum % i == 0)
{
func(i);
func(sum / i);
}
}
for (int i = 1; i <= sum; i++)
{
if (sum % i != 0)continue;
if (abs(m[i] - m[sum / i]) == 1)
{
cout << sum / i << " " << m[sum / i] << endl;
cout << i << " " << m[i] << endl;
return 0;
}
}
return 0;
}