Luogu2261 CQOI2007 餘數求和

2022-08-13 22:21:14 字數 1098 閱讀 5902

題目藍鏈

定義函式\(g(n, k) = \sum\limits_^ k~mod~i\),給定\(n, k\),求函式\(g\)的值

\(n, k \leq 10^9\)

我一開始看這題的時候居然還懵了一下

因為當\(i > k\)時,餘數一定都是\(k\),所以我們只需要考慮\(i \leq k\)的部分怎麼求

我們可以把\(k\)表示成\(a \cdot i + b\)的形式,我們發現\(k\)分別整除\([1, k]\)之間的數,最多隻會有根號級別的商的個數

我在這裡簡單證明一下

當除數\(\leq \sqrt k\)時,因為除數只有\(\sqrt k\)個,顯然商也只會有\(\sqrt k\)個

當除數\(\gt \sqrt k\)時,因為商會小於\(\sqrt k\),所以商最多也只有\(\sqrt k\)個

所以我們可以通過整除分塊來解決這個問題

我們用整除分塊找出所有\(a\)相同的\(i\)的區間,在這段區間內\(b\)一定會是乙個公差為\(a\)的等差數列,可以直接\(\mathcal(1)\)計算得

所以總的複雜度為\(\mathcal(\sqrt k)\)

#include using namespace std;

#define fst first

#define snd second

#define mp make_pair

#define squ(x) ((ll)(x) * (x))

#define debug(...) fprintf(stderr, __va_args__)

typedef long long ll;

typedef pairpii;

templateinline bool chkmax(t &a, const t &b)

templateinline bool chkmin(t &a, const t &b)

inline int read()

int main()

printf("%lld\n", ans);

return 0;

}

luogu2261 CQOI2007 餘數之和

求 sum k mod i n,k leq 10 9 先只考慮 n leq k 的情況。sum k mod i sum k i lfloor frac rfloor kn sum i lfloor frac rfloor 看到 sum lfloor frac rfloor 則想到整除分塊。lfloo...

P2261 CQOI2007 餘數求和

數學題,無背景 給出正整數n和k,計算g n,k k mod 1 k mod 2 k mod 3 k mod n的值,其中k mod i表示k除以i的餘數。例如g 10,5 5 mod 1 5 mod 2 5 mod 3 5 mod 4 5 mod 5 5 mod 10 0 1 2 1 0 5 5 ...

P2261 CQOI2007 餘數求和

我是題面 題意還是很清晰,很容易理解 1e9範圍明顯不能暴力,除非你能把常數優化到 frac1 但我實在想象不到用了這麼多取模怎麼把常數優化下去 我們可以把 k i 變成 k k i i 整除 那麼總的和也就從 sum k i 變成了 sum n k k i i 又可以轉化為 nk sum n k ...