中位因數(數論)
思路:分析可知:除了完全平方數外,因數肯定是成對出現。
設爲的中位因數。
所以當爲完全平方數時,顯然因數個數爲奇數個,顯然
當不爲完全平方數時,因數爲偶數個,顯然要去取最中間的兩個數的平均值。
此時我們可以知道的兩個因數(假設) 中肯定是所有對中較小因數當中最大的那個.
根據數論知識和素數篩的方法,我們很容易想到去枚舉每個數較小的因數,然後不斷更新.最後遞推求和即可。
其實兩種情況都可以通過枚舉較小因數,不用區分。
時間複雜度:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+5,mod=1e9+7,M=1e6;
int ans[N],a[N],n,t;
int main(){
for(int i=1;i<=M;i++)
for(int j=i;i*j<=M;j++){
a[i*j]=(i+j)/2;
}
for(int i=1;i<=M;i++) ans[i]=(ans[i-1]+a[i])%mod;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
printf("%d\n",ans[n]);
}
return 0;
}