hihocoder 第八十九周

本文探讨了如何找到小于等于指定整数的所有整数中具有最多除数的那个,并通过代码实现了解决方案。利用质因数分解和优化剪枝策略,我们能够有效地解决这个问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Given an integer n(n<=10^16), for all integers not larger than n, find the integer with the most divisors. If there is more than one integer with the same number of divisors, print the minimum one.

样例:100 结果60

分析:
1、n = p1^n1 * p2^n2 * p3^n3 * ... * pk^nk
   MaxDivisors = (n1+1)*(n2+1)*(n3+1)* ... * (nk+1);
2.在一个数范围之内,相对于因子个数最多的数来说,p越小,n越大才是最优的,同时可以优化剪枝
   若p1<p2,则n1>=n2;
#include<stdio.h>
#include<string.h>
#include<math.h>
#define ll long long
using namespace std;
int prime[41]={2,3,5,7,11,13,17,19,23,29,31,37,41,43};//这些素因子之积会超过n的范围
ll Maxdivisors;
ll result;
ll n;
ll Pow(int x,int k){
	ll s=1;
	for(int i=1;i<=k;i++)
	{
		s*=x;
	}
	return s;
}
void dfs(int x,ll now,ll divisors,int lastNi){
	if(Maxdivisors<divisors||(Maxdivisors==divisors&&result>now)){
		Maxdivisors=divisors;
		result=now;
	}
	int i=1;
	while(now*Pow(prime[x],i)<n&&i<=lastNi){
	         dfs(x+1,now*Pow(prime[x],i),divisors*(i+1),i);
	         i++;
	}
}
int main(){

	while(scanf("%lld",&n)!=EOF){
		int a=log(n);
		Maxdivisors=1;
		result=n;
		for(int i=1;i<=a;i++){               //枚举初始值素因子2的个数
			dfs(1,Pow(2,i),i+1,i);
		}
		printf("%lld\n",result);
	}
	return 0;

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值