1. 程式人生 > 資訊 >《劍網 3 懷舊服》將於 7 月 30 日不刪檔全網上線

《劍網 3 懷舊服》將於 7 月 30 日不刪檔全網上線

跟數列的分塊思路相似,但是絕對不一樣!!!

〇、題目

給出\(N\),求\(\sum\limits^{N}_{i=1}\lfloor \dfrac{N}{i}\rfloor\)

一、思路

就比如說\(N=20\)的時候,我們發現,這些商下取整後的結果為:

i: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
N/i 20 10 6 5 4 3 2 2 2 2 1 1 1 1 1 1 1 1 1 1

觀察前面還沒什麼特點,但是到後面就很明顯:11到20一整段都是1。於是,我們想把商為一個數的這些除數分成一個塊。
我們對於每一個\(i\in {1,2,3,...,n}\)

首先找到當前的商\(T\),然後用\(R= \lfloor\dfrac{N}{T}\rfloor\)找到商相等的最後一個數,那我們的答案就加上\((R-i+1)\times T\),然後\(i\)就要跳到\(R+1\)

二、程式碼

#include<bits/stdc++.h>
using namespace std;
long long n;
long long c(){
	long long ans=0,l=1,r;//l就是i,r是R,ans是最終答案
	for(;l<=n;l=r+1){//l已經初始化了,從1到n看,每次最後l=r+1
		long long t=n/l;//t是T
		r=n/t;//算出r
		ans+=(r-l+1)*t;//加上這個區間的和
	}
	return ans;//返回
}
int main(){//輸入輸出
	cin>>n;
	cout<<c()<<endl;
	return 0;
}

最後,求點贊,感謝你的閱讀!