CQOI2007 餘數求和

2022-05-21 11:42:10 字數 959 閱讀 1156

給出n,k求k%1~n每乙個數的和

首先將原始式子變形成為nk-(k/1*1+k/2*2...k/n*n),此處的除法都是向下取整,也就是說不可以使用運算律了。

那麼我們通過簡化式子,得到了乙個不能用運算律的式子。此時我們發現不能暴力去算他。於是嘗試著找了一會規律,可得到乙個**。(以100為例)

(相同的用顏色標記出來)

如果說顏色是區間的話。那麼知道左端點就可以知道右端點

記左端點為x,右端點為y.y=k/(k/i),注意此處k/i向下取整。

又由於區間與區間是相連的,所以說下乙個區間的左端點為這乙個區間的右端點加一

並且第乙個區間的左端點為1.由此可以計算出所有的區間。

1)解題:

將區間思想與式子結合起來。將k/1*1+k/2*2...k/n*n按照區間分開來計算。知道k/i的定值,提取乙個k/i的公因數,剩下的x,x+1,x+2...求和。

2)額外補充:

右端點取出來可能大於n,要處理一下。

當n>k的時候,會出現k/i=0的情況,先把後面的累積到答案中,然後切換成n=k的子任務。

#includeusing

namespace

std;

#define ll long longll n,k,ans;

intmain()

ll z=1,y=1

;

while(z<=n)

cout

<

return0;

}

view code

CQOI2007 餘數求和

求 ans k 1 k 2 k n 這題目應該算是數論裡比較簡單的了 求 ni 1 kmod i i 1nkm od i我們知道 a b a b a b 即 ni 1 kmod i n i 1 k i k i n k ni 1 i k i i 1nkm odi i 1 n k i k i n k i...

CQOI2007 餘數求和

題面 這道題用到了數論分塊 首先什麼是數論分塊 顧名思義就是分塊在數論上的應用 不過非常神奇的一點是你如果不會分塊但你還是可以會數論分塊的 所求為 i 1nkm od i sum k mod i i 1 n kmod i將這個式子改為 i 1nk i ki sum k i left lfloor f...

CQOI2007 餘數求和

傳送門 或許這也算是道神仙題?題目描述非常直白,我們把式子轉化一下,其實就是求n k k i i。而k i是可以使用除法分塊來做的 假設t k i,如果t 0,那麼它的末端就是n,這個很顯然,如果不等於0的話,那麼末端就是k t。之後我們就神奇的過了這道題 極短。include include in...