BZOJ1257 餘數之和,整除分塊

2021-09-29 08:06:32 字數 1056 閱讀 6747

給出正整數n和k,計算j(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值

其中k mod i表示k除以i的餘數。

例如j(5, 3)=3 mod 1 + 3 mod 2 + 3 mod 3 + 3 mod 4 + 3 mod 5=0+1+0+3+3=7

輸入僅一行,包含兩個整數n, k。

1<=n ,k<=10^9output

輸出僅一行,即j(n, k)。

5 3

取模運算沒有啥比較好的運算公式,故一般轉化為除法運算。

f(n, k) = k mod 1 + k mod 2 + ... + k mod n

= k-floor(k/1)*1 + k-floor(k/2)*2 + ... + k-floor(k/n)*n.  

= n * k - (floor(k/1)*1 + floor(k/2)*2 + ... + floor(k/n)*n).

1.因為對於計算式 k / x,最多有 2 * sqrt(k) 個不同的數,所以上述括號中floor部分最多有 十萬 左右個不同的結果.

證明如下: 當 x <= sqrt(k)時,顯然有不超過sqrt(k)個結果,當x > k時,顯然 1 < x / k < sqrt(k),所以結論成立。

2.所以括號部分最多被分為1e5個段,每個段中具有相同的結果。所以只要知道了每一段的首項和末項,就可以利用等差公式在十萬級別內算出最終結果.

3.每一段的末項可由如下結論得到:和 floor(k/x) 相等的最大 x 等於 floor(k/floor(k/x)). 所以**可實現. 

證明過程暫略。

#include using namespace std;

typedef long long ll;

int main ()

cout << sum << endl;

} return 0;

}

the end;

BZOJ 1257 餘數之和 整除優化

給定正整數n和k,計算 k mod 1 k mod 2 k mod n 的值。1 n,k 1e9 首先我們可以先將式子進行轉換,kmo di k i k i 原式 n k i 1n i k i k mod i k i lfloor k i rfloor 原式 n k sum limits i lfl...

BZOJ 1257餘數之和

給出正整數n和k,計算j n,k k mod 1 k mod 2 k mod 3 k mod n的值 其中k mod i表示k除以i的餘數。例如j 5,3 3 mod 1 3 mod 2 3 mod 3 3 mod 4 3 mod 5 0 1 0 3 3 7 輸入僅一行,包含兩個整數n,k。1 n ...

bzoj 1257 餘數之和sum 數學

time limit 5 sec memory limit 162 mb submit 3081 solved 1425 submit status discuss 給出正整數n和k,計算j n,k k mod 1 k mod 2 k mod 3 k mod n的值,其中k mod i表示k除以i的...