數論 分塊入門題

2021-09-25 10:00:21 字數 1670 閱讀 9807

只有一行乙個整數 n(0 < n < 1000000)。

只有一行輸出,為整數m,即f(1)到f(n)的累加和。

答案即為1..x1..x的所有約數個數和。

我們知道換種形式答案就是∑i⌊ni⌋∑i⌊ni⌋。

那麼暴力演算法來了:所以我們

for (int i=1; i<=n; i++)

ans += n/i;

就好了。

由於n=1e6,所以這個o(n)的演算法是能夠過去的。但是不行!這個是數論分塊的板子題,我們怎麼能夠止步於o(n)的演算法呢?

若用g(i)表示n/i,顯然

自然而然地想到,在求g(i)的同時能不能夠求出[i,j]呢?

這裡有乙個結論,

我們有

故jj是滿足條件的最大值。

我們要做的就是列舉可能的下整值,並合併計算。

#includetypedef long long ll;

int n;

ll ans;

int main()

[cqoi2007]餘數求和

來自大佬的證明

#include#include#include#define ll long long

using namespace std;

int main()

cout求∑∑((n mod i)*(m mod j))其中1<=i<=n,1<=j<=m,i≠j。

第一行兩個數n,m。

乙個整數表示答案mod 19940417的值

3 41

樣例說明

答案為(3 mod 1)*(4 mod 2)+(3 mod 1) * (4 mod 3)+(3 mod 1) * (4 mod 4) + (3 mod 2) * (4 mod 1) + (3 mod 2) * (4 mod 3) + (3 mod 2) * (4 mod 4) + (3 mod 3) * (4 mod 1) + (3 mod 3) * (4 mod 2) + (3 mod 3) * (4 mod 4) = 1資料規模和約定

對於100%的資料n,m<=10^9。

ll sum(ll n)// n*(n+1)*(2*n+1)/6 完全平方數 求和公式

ll solve(ll m,ll n)

return res;

}int main()

cout<

}

數論分塊入門

目錄通常用來解決 sum n lfloor frac rfloor 這種問題。我們代入 n 10。i1 2345 6789 10 lfloor frac rfloor 105 3221 1111 可以看到後面有連續的 i lfloor frac rfloor 相同。呈現塊狀分布 每個塊的起點 l 和...

數論 數論分塊

求解圖中紅點和綠點的總數之和。求 sum k space mod space i 如果縱軸的x乙個點乙個點進行移動的話,將會非常緩慢。k i k fraci times i 於是有 sum k space mod space i sum k fraci times i n times k sum i...

分塊入門題

分塊入門題5 給 l,r 取開方,乙個數字最多被取開方6次,那麼乙個塊內有需要開方的時候才對這個塊取開方,那麼最多6 n sqrt n 次,分塊直接寫 includeusing namespace std typedef long long ll const int maxn 1e5 7 int l...