定义:将正整数 �x 的约数个数表示为 �(�)g(x) 。例如,�(1)=1g(1)=1,�(4)=3g(4)=3,�(6)=4g(6)=4。
如果对于任意正整数 �y,当 0<�<�0<y<x 时,�x 都满足 �(�)>�(�)g(x)>g(y), 则称 �x 为反质数。例如,整数 11,22,44,66 等都是反质数。
现在任意给定两个正整数 �,�M,N,其中,按从小到大输出其中(包括 �M 和 �N)的所有反质数。如果没有,则输出大写的 NO
。
输入格式
一行,包含两个正整数 �M 和 �N,用单个空格隔开。
输出格式
在一行内输出 �M 到 �N 的所有反质数,以逗号间隔。如果没有,则输出 NO
。
样例
输入样例
1 13
输出样例
1,2,4,6,12
数据范围
对于 30%30% 的数据,�<�≤2⋅103M<N≤2⋅103
对于 50%50% 的数据,�<�≤2⋅105M<N≤2⋅105
对于 70%70% 的数据,�<�≤3⋅106M<N≤3⋅106
对于 100%100% 的数据,�<�≤2⋅107M<N≤2⋅107
#include <cstdio>
#include <iostream>
using namespace std;
const int NN = 1e7;
int a[NN], k = 0;
// 计算正整数x的约数个数
int yueshu(int x)
{
int count = 0;
for (int i = 1; i <= x; i++)
{
if (x % i == 0)
{
count++;
}
}
return count;
}
// 判断正整数x是否为反质数
bool find_1(int x)
{
for (int i = 1; i < x; i++)
{
if (yueshu(x) <= yueshu(i))
{
return false;
}
}
return true;
}
// 找出从M到N之间的所有反质数并输出
void find(int M, int N)
{
for (int i = M; i <= N; i++)
{
if (find_1(i))
a[k++] = i;
}
}
int main()
{
int M;
int N;
cin >> M >> N;
find(M, N);
if (k != 0)
{
for (int i = 0; i < k - 1; i++)
cout << a[i] << ",";
cout << a[k - 1];
}
else
cout << "NO";
return 0;
}