luogu2261 CQOI2007 餘數之和

2022-06-30 08:57:09 字數 1176 閱讀 1786

\[\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

\]則想到整除分塊。

\[\lfloor \frac\rfloor=\lfloor\frac\rfloor}\rfloor}\rfloor

\]當\(\lfloor\frac\rfloor}\rfloor\)一定時,所有滿足上式的\(i\)都在一段連續的區間內(組成了一塊),區間右端點是\(\lfloor\frac\rfloor}\rfloor\)。

因此操作時,直接對一塊進行統一操作即可。

令一塊的左端點為\(l\),右端點為\(r\),\(v=\frac\),我們現在要求一塊內的和

\[\sum_^iv=\sum_^v(l+i)=v\sum_^(l+i)

\]此時注意:和式中運算的次數為\(r-l-0+1=r-l+1\),而不是\(r-l\)。所以接下來

\[原式\neq v(l(r-l)+\sum_^i)

\]\[原式=v(l(r-l+1)+\sum_^i)

\]在這裡錯了就完了!

最終運用等差數列的知識得到

\[原式=\frac

\]把所有的上式加起來再被\(nk\)一減即可。

邊界條件:賦值\(r\)時,它不能直接等於\(\lfloor\frac\rfloor}\rfloor\),而應當是它和\(n\)的較小值。另外還要考慮\(\lfloor\frac\rfloor=0\)的情況。

對於\(n>k\)的情況,把額外值加上即可。要明確\(n-k\)以及\(k\)的含義呀!

#include #include #include #include using namespace std;

#define ll long long

int main()

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

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

return 0;

}

Luogu2261 CQOI2007 餘數求和

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

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 ...