數論分塊入門

2022-06-27 17:57:14 字數 1506 閱讀 1846

目錄通常用來解決 \(\sum_^n\lfloor\frac\rfloor\) 這種問題。

我們代入 n = 10。i1

2345

6789

10\(\lfloor\frac\rfloor\)105

3221

1111

可以看到後面有連續的 \(i\), \(\lfloor\frac\rfloor\) 相同。呈現塊狀分布

每個塊的起點 \(l\) 和終點 \(r\) 滿足規律:\(r=\lfloor\frac\rfloor}\rfloor\)

而 \(\lfloor\frac\rfloor\) 的有效取值只有 \(o(\sqrt n)\) 個,求解 \(\sum_^n\lfloor\frac\rfloor\) 就可以快速的實現了。

int ans=0;

for(int l=1,r;l<=n;l=r+1)

p2261 [cqoi2007]餘數求和

給出正整數 n 和 k,請計算

\[g(n, k) = \sum_^n k \bmod i

\]其中 \(k\bmod i\) 表示 k 除以 i 的餘數。

化簡給出的式子 \(k \bmod i=k-\lfloor\frac\rfloor\times i\)

\[\begin

g(n, k) &= \sum_^n k \bmod i\\

&=\sum_^n(k-\lfloor\frac\rfloor\times i)\\

&=n\times k-\sum_^n(\lfloor\frac\rfloor\times i)

\end

\]對於 \(\sum_^n(\lfloor\frac\rfloor\times i)\),每個塊我們求出 \([l,r]\) 的和 乘 當前塊的 \(\lfloor\frac\rfloor\)

累加起來即可

#include #define pb push_back

using namespace std;

typedef long long ll;

typedef unsigned long long ull;

const int mod = 1e9 + 7;

const double eps = 1e-6;

const int inf = 0x3f3f3f3f;

const int n = 2e5 + 10;

int main()

printf("%lld\n", n * k - ans);

return 0;

}

p1403 [ahoi2005]約數研究

\(f(i)\) 表示 \(i\) 的約數的個數,給出 \(n\) ,請求出 \(\sum_^f(i)\)

列舉約數 \(i\),顯然,區間 \([1,n]\) 中,有 \(\lfloor\frac\rfloor\) 個數字是 \(i\) 的倍數。

答案即為 \(\sum_^n\lfloor\frac\rfloor\)

數論 分塊入門題

只有一行乙個整數 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...

數論 數論分塊

求解圖中紅點和綠點的總數之和。求 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...

整除分塊(數論分塊)

乙個有 趣的問題 求 sum n lfloor frac ni rfloor n leq 10 顯然不能直接做廢話 經過一番冷靜推理暴力打表 我們發現以下性質 1.large lfloor frac ni rfloor 最多只有 2 sqrt 種取值 證明 對於 i le sqrt,只有 sqrt ...