反素数ant(数约数的个数)

反素数ant

时间限制: 1 Sec  内存限制: 128 MB

题目描述

对于任何正整数x,其约数的个数记作g(x)。例如g(1)=1、g(6)=4。如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数。例如,整数1,2,4,6等都是反质数。现在给定一个数N,你能求出不超过N的最大的反质数么?

 

输入

一个数N(1<=N<=2,000,000,000)。

 

输出

不超过N的最大的反素数。

 

样例输入

复制样例数据

1000

样例输出

840

一个数约束的个数:设这个数是由x1,x2,x3....乘起来的(xi都是素数),那么一个数的约数个数就是这些素数次数+1乘起来;

如 36 = 2^2*3^2,那么约数个数为(2+1)*(2+1)=9;

 

/**/
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <stack>
#include <queue>

typedef long long LL;
using namespace std;

LL n;
int a[12] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37};//没必要很多个素数,素数越大次数越小
LL maxx, ans;

void dfs(int num, LL sum, int tim, int pre){// pre表示前面的用了素数用了几次,肯定素数小的用的多才好
	if(num == 12){
		if(tim > ans && maxx < sum) maxx = sum, ans = tim;//次数多的并且这个数肯定比约数少的数大
		if(tim >= ans && maxx > sum) maxx = sum, ans = tim;//取次数相同时值最小的
		return ;
	}
	LL t = 1;
	for (int i = 0; i <= pre; i++){
		dfs(num + 1, sum * t, tim * (i + 1), i);
		t *= a[num];
		if(t * sum > n) break;
	}
}

int main()
{
	//freopen("in.txt", "r", stdin);
	//freopen("out.txt", "w", stdout);

	scanf("%lld", &n);
	dfs(0, 1, 1, n >> 1);
	printf("%lld\n", maxx);

	return 0;
}
/**/

 

全部评论

相关推荐

01-23 14:54
同济大学 Java
热爱敲代码的程序媛:给你提几点【专业技能】这个模块里面可优化的地方:1.【具备JVM调优经验】可以去b站上搜一下JVM调优的视频,估计一两个小时凭你的学习能力就能掌握JVM调优的实践方面的技能。2.【MySql优化】MySql这一栏,你去b站或者找个博客看看MySql优化,学一下,如果你本身比较熟悉MySql语句的话,那基本半天时间凭你的学习能力MySql语句优化方面的技能你也能掌握个差不多。以上1,2两点主要是因为我看你专业技能大部分都说的是偏理论,没有写应用。再就是最后,你结合你的项目,想一想你的项目中哪些sql语句是可以用MySql优化的,到时候你面试的时候也好结合着说一下。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务