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<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]++;
}
}