因为第5个数大约3e8
n*sqrt(n)的写法是3e12左右,时间爆炸
这时候应该考虑n*log(n)即,大约1e9的写法
一个公式
假设这个数是n,质因数分解后可以写成
n=a1^k1*a2^k2*……*ai^ki
所求的数的因数和f(n)就等于
f(n)=(1+a1+a1^2+……+a1^k1)*(1+a2+a2^2+……+a2^k2)*……*(1+ai+ai^2+……+ai^ki)
然后打个素数表,就ok了
/*耗时73s*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5+7;
bool vis[maxn];
int prim[maxn],cnt;
void sprim(){
for(int i=2;i<maxn;i++){
if(!vis[i])prim[cnt++] = i;
for(int j=0;j<cnt && prim[j]*i<maxn;j++){
vis[prim[j]*i] = 1;
if(i%prim[j] == 0)break;
}
}
}
int main(){
sprim();
//for(int i=0;i<20;i++)printf("%d\n",prim[i]);
for(ll i=1;;i++){
ll x = 1,ti = i;
for(int j=0;j<cnt && 1ll*prim[j]*prim[j]<=ti;j++){
if(ti%prim[j] == 0){
ll p = prim[j];
ll tmp = 1;
while(ti%prim[j] == 0)
tmp += p,p *= prim[j],ti /= prim[j];
x *= tmp;
}
}
if(ti != 1)
x *= (1+ti);
if(x == 2*i)printf("%lld\n",i);
}
return 0;
}