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