題目藍鏈
定義函式\(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 ...