题意:求1-N每个数的正约数集合,如果用O(sqrt(n))的试除法去做,总复杂度O(Nsqrt(N))复杂度太高,当N=1e6的时候就卡了
思路:反过来考虑,对于每个数d,1-N中以d为约数的数就是d的倍数d,2d,3d,4d…[N/d]*d;
时间复杂度O(NlogN):怎么算?
N+N/2+N/3+N/4+N/5+N/6+….N/N=N(1+1/2+1/3+1/4+1/5+…..1/N)=O(NlogN)
后面是个调和级数,关于调和级数的和大致的答案我之前有写
#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=1e5;
typedef long long LL;
vector<int> factor[maxn];
int main(void)
{
cin.tie(0);std::ios::sync_with_stdio(false);
for(LL i=1;i<=n;i++)
for(LL j=1;j<=n/i;j++)
factor[i*j].push_back(i);
for(LL i=1;i<=n;i++){
for(LL j=0;j<factor[i].size();i++)
cout<<factor[i][j]<<' ';
cout<<endl;
}
return 0;
}