198. 反素数

// 198. 反素数.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//


/*
https://www.acwing.com/problem/content/200/
对于任何正整数 x,其约数的个数记作 g(x),例如 g(1)=1、g(6)=4。
如果某个正整数 x 满足:对于任意的小于 x 的正整数 i,都有 g(x)>g(i),则称 x 为反素数。
例如,整数 1,2,4,6 等都是反素数。
现在给定一个数 N,请求出不超过 N 的最大的反素数。

输入格式
一个正整数 N。

输出格式
一个整数,表示不超过 N 的最大反素数。

数据范围
1≤N≤2∗109
输入样例:
1000
输出样例:
840



输出
1745944200
标准答案
1396755360

*/



#include <iostream>

using  namespace std;

const int a[9] = { 2,3,5,7,11,13,17,19,23 };

long long n;
long long curr;
long long maxd;
long long ans;

void dfs(int idx, int lastmi,long long num) {
	if (  (curr > maxd) || (curr == maxd  &&  num < ans)  ){
		maxd = curr;
		ans = num;
		//cout << "dfs " << maxd << " " << ans << endl;
	}

	if (idx >= 9 || num > n) {
		return;
	}


	dfs(idx + 1, 0, num);

	for (int i = 1; i <= lastmi; i++) {
		num *= 1ll*a[idx];
		if (num > n) break;
		curr = curr*(1ll + i);
		dfs(idx + 1, i, num);
		curr = curr/(1ll + i);
	}

	return;
}


int main()
{
	cin >> n;
	curr = 1; ans = 1;
	dfs(0, 31,1);

	//cout << maxd << endl;
	cout << ans << endl;

	return 0;
}

posted on 2025-03-19 15:18  itdef  阅读(20)  评论(0)    收藏  举报

导航