目錄通常用來解決 \(\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 ...