【洛谷P2261】余數求和
阿新 • • 發佈:2019-03-15
快速 using 相等 amp \n pri ace 不同的 turn 時,\(k \over i\) 的值都相等。
題目大意:給定 n, k,求\(\sum\limits_{i=1}^n k\%n\) 的值。
題解:除法分塊思想的應用。
\(x\%y=x-y\lfloor {x\over y}\rfloor\),因此只需快速求出 \(\sum\limits_{i=1}^n {k\over i}\) 即可。
引理:\(i\in [1,k], {k\over i}\) 最多只有不超過 \(2\sqrt k\) 個不同的值。(分情況討論即可得出)
現在,只需找出每一段的起點和終點即可根據等差數列求和的方式來在 \(O(\sqrt(n))\) 的時間內求得答案。
引理:\(i\in [x,\lfloor k/{\lfloor k/x \rfloor}\rfloor]\)
代碼如下
#include <bits/stdc++.h> using namespace std; long long n,k,ans; int main(){ scanf("%lld%lld",&n,&k); ans=n*k; for(int l=1,r;l<=n;l=r+1){ r=k/l?min(k/(k/l),n):n; ans-=(k/l)*(l+r)*(r-l+1)/2; } printf("%lld\n",ans); return 0; }
【洛谷P2261】余數求和