约数个数定理及实现

约束个数定理:
对于一个大于1正整数n可以分解质因数:n=p1^k1*p2^k2*p3^k3.......
则约数个数x=(k1+1)*(k2+1)*(k3+1)*......
1:给你一个n求出最小的约束为n个的数。

思路:建树搜索,以每一个pi为一层建树搜索。

#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
#define ll long long
const ll maxm = 1e18;
ll ans, n;
int prime[10] = { 2,3,5,7,11,13,17,19,23,29 };
void dfs(int a, int b, ll temp);
int main()
{
	while (scanf("%d", &n) != EOF)
	{
		ans = maxm;
		dfs(1, 0, 1);
		printf("%I64d\n", ans);
	}
	return 0;
}
void dfs(int a, int b, ll temp)
{
	if (a == n&&ans >= temp)
		ans = temp;
	if (a >= n)
		return;
	for (int i = 1;i <= 64;i++)
	{
		if (ans / prime[b] < temp)
			break;
		temp *= prime[b];
		dfs(a*(i + 1), b + 1, temp);
	}
}

2:求n以内约数个数最多的数,如果有多个输出最小值。
基本和上题一样。

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
#define ll long long
const int ll maxm = ~0ULL;
ll n, ans, sum = 0;
int p[16] = { 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53 };
void dfs(int a, int b, ll temp);
int main()
{
	while (cin >> n)
	{
		ans = maxm;
		sum = 0;
		dfs(1, 0, 1);
		cout << ans << endl;
	}
	return 0;
}
void dfs(int a, int b, ll temp)
{
	if (b >= 16)
		return;
	if (a >= sum)
	{
		if (a > sum)
		{
			sum = a;
			ans = temp;
		}
		else if (a == sum&&temp < ans)
			ans = temp;
	}
	for (int i = 1;i <= 64;i++)
	{
		if (temp*p[b] > n)
			break;
		temp *= p[b];
		dfs(a*(i + 1), b + 1, temp);
	}
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值