不一样的排序(小米 OJ 4 月常规赛第一题 )

本文探讨了一种基于因子个数的排序算法,用于解决特定的数字排序问题。通过分析和优化因子个数的计算方法,实现了更高效的排序过程。介绍了暴力解法的局限性,分享了利用质因数分解优化因子计算的技巧,并展示了两种不同的优化方案。

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

https://code.mi.com/problem/list/view?id=128&cid=11

有 n 个数,需要用因子个数的多少进行排序,因子个数多的排在后面,因子个数少的排在前面,如果因子个数相同那么就比较这个数的大小,数大的放在后面,数小的放在前面。现在让你说出排序之后第 K 个位置的数字是多少。

输入

 

第 1 个整数为整数 KKK,1≤K≤1061 \le K \le 10^61≤K≤106;

第 2 个为整数 nnn,表示数字的数量,n&lt;107n \lt 10^7n<107;

接下来有 nnn 个整数,每个数的大小不超过 10610^6106.

输出

 

输出排序之后的第 KKK 位置的数值。

 

输入样例

4 6 1 2 3 4 5 6

 

输出样例

5

刚开始用暴力,不出意外T了。百度之后发现了求因子个数的公式:

对于任意的整型N,分解质因数得到N= P1^x1 * P2^x2* …… * Pn^xn;

则N的因子个数M为 M=(x1+1) * (x2+1) * …… *(xn+1);

 

int num(int n)
{
	int s=1;
	for(int i=2;i*i<=n;i++)
	{
		if(n%i==0)
		{
			int a=0;
			while(n%i==0)
			{
				n/=i;
				a++;
			}
			s*=(a+1);
		} 
	}	
	if(n>1)		
	s*=2;
	return s;
}

这样虽然能过,但运行时间好长啊,于是就去看了别的大佬通过的代码,发现大佬们都是,,打表(发现公式的时候还以为自己找到了正解,原来这才是正解,,我好菜啊)

void init()
{
	for(int i=1;i<N;i++)
	for(int j=i;j<N;j+=i)
		cc[j]++;
}

或者

void init()
{
	for(int i=1;i*i<=N;i++)
	{
		for(int j=i+1;i*j<=N;j++)
			cc[i*j]+=2;
		cc[i*i]++;
	}
		
}

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值