中位因數(數論)

中位因數(數論)

思路:分析可知:除了完全平方數外,因數肯定是成對出現。

a[i]a[i]ii的中位因數。

所以當nn爲完全平方數時,顯然因數個數爲奇數個,顯然a[i]=ia[i]=\sqrt{i}

nn不爲完全平方數時,因數爲偶數個,顯然要去取最中間的兩個數的平均值。

此時我們可以知道nn的兩個因數x,yx,y(假設x<yx<y) 中xx肯定是所有對中較小因數當中最大的那個.

根據數論知識和素數篩的方法,我們很容易想到去枚舉每個數較小的因數,然後不斷更新a[i]a[i].最後遞推求和即可。

ps:ps:其實兩種情況都可以通過枚舉較小因數,不用區分。

時間複雜度:O(nlogn)O(nlogn)

#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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章