求约数个数最多问题

求1 - n当中约数个数最多的数,若有多解则输出最小的数。

一般解法:
从1到n枚举 根据  约数个数定理 公式求出约数个数
这需要先求出1到n的所有质数
以此来对第i个数分解质因数 质因数变化即 乘以 (上一个质因数个数+1)
对于n非常大时候效率很低



从图中可以看出 约数最多的数a
1. a中较小的质因数个数必定大于等于大一级的质因数个数
2. 随着a的递增 质因数的"种类"也按照质数的出现顺序递增

质数数组为prim(n)  则有

约数最多的数a = prim(0) ^ x0 + prim(1) ^ x1 + ...... + prim(n - 1) ^ x(n - 1)
a 的约数个数 = (x0 + 1) * (x1 + 1) * (x2 + 1) * ...... * (x(n - 1) + 1) 
x0 >= x1 >= x2 >= x3 >= ...... >= x(n - 1)


#include <iostream>
using namespace std;
long nb; int mc;
int p[] = {2,3,5,7,11,13,17,19};

//d 素数深度 c素数次方限制 tot约数个数 num当前数 up上限值
void ss(int d, int c, int tot, long long num, long up)
{
	if((tot > mc) || ((tot == mc) && (num < nb)))
	{mc = tot; nb = num;}
	if(d > 7) return;
	long j = p[d], m = 1;
	long long n = num * j;
	while(m <= c && n <= up)
	{
		ss(d + 1, m, tot * (m + 1), n, up);
		n *= j; m++;
	}
}

int main()
{
	int t; long n;
	cin>>t;
	while(t--)
	{
		cin >> n;
		mc = nb = 1;
		ss(0, 27, 1, 1, n);
		cout << nb << " " << mc << endl;
	}
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值