BZOJ1053 反素数 数学 搜索

题目链接

https://www.lydsy.com/JudgeOnline/problem.php?id=1053

分析

由反素数的定义可知,该数一定是不超过 N N N 的数中,约数个数最多的数中最小的。

考虑将该数质因数分解,要保证不超过 2 × 1 0 9 2 \times 10 ^ 9 2×109,则其质因数个数不超过 10 10 10

同时要在约数个数相同的情况下最小,肯定是最多用到前 10 10 10 个质数,且其指数不增。

在以上限制条件下,搜索质数的指数即可。

AC代码

#include <cstdio>

inline int read() {
	int num = 0;
	char c = getchar();
	while (c < '0' || c > '9') c = getchar();
	while (c >= '0' && c <= '9')
		num = num * 10 + c - '0', c = getchar();
	return num;
}

const int maxn = 15, maxt = 35;
const int prime[10] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29};

int n, p[maxn][maxt], ans, maxc;

void dfs(int now, int mul, int last, int cnt) {
	if (now == 10) {
		if (cnt > maxc || (cnt == maxc && ans > mul)) ans = mul, maxc = cnt;
		return;
	}
	for (int i = 0; i <= last; ++i)
		if (p[now][i] && 1ll * mul * p[now][i] <= n)
			dfs(now + 1, mul * p[now][i], i, cnt * (i + 1));
}

int main() {
	n = read();
	for (int i = 0; i < 10; ++i) {
		p[i][0] = 1;
		for (int j = 1; j <= 30; ++j)
			if (1ll * p[i][j - 1] * prime[i] <= n)
				p[i][j] = p[i][j - 1] * prime[i];
	}
	dfs(0, 1, 30, 1);
	printf("%d", ans);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值