Acwing198. 反素数

题意

给你N(<2e9) 求N以内约数个数最多的最小的那个数?

思路

X = 2^c1 * 3^c2 * …… * 23^c9  约数个数=(c1 + 1)*(c2 + 1)*.....*(cn + 1);

2e9的范围 质因子最多用到23  质因子的次数(c1~cn)最多是30(<2^31)

且次数满足递减 c1>=c2>=c3......>=cn 这是因为约数的个数只与次数c1~cn相关,我们要找的是约数个数最大的最小的那个数,如果c2>c3将两者次数交换产生的X约数个数相等,交换后的数变大,因此次数满足递减。

综上,采取爆搜!妙啊!

代码

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>

using namespace std;
typedef long long LL;

int n,ans,Ys = 0;
int prime[10] = {0,2,3,5,7,11,13,17,19,23};

void dfs(int cnt,int C,int num,int yue){
	if(yue > Ys || yue == Ys && num < ans){
		ans = num;
		Ys = yue;
	}
	if(cnt == 10) return ;
	for(int i = 1;i <= C; i++){
		if((LL)num * prime[cnt] > n) break;
		num *= prime[cnt];
		dfs(cnt + 1,i,num,yue * (i + 1));
	}
}

int main()
{
	scanf("%d",&n);
	dfs(1,30,1,1);//第几个素数,次数不能超过,ans,Ys
	printf("%d\n",ans);
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值