给定$n,k$$(1\leqslant n,k\leqslant 10^9)$,计算$\sum\limits _{i=1}^nk\: mod\:i$ 通过观察易发现$k\%i=k-\left \lfloor \frac{k}{i} \right \rfloor*i$,因此我们考虑把$\left \lfloor \frac{k}{i} \right \rfloor$的值相同的$i
给定$n,k$$(1\leqslant n,k\leqslant 10^9)$,计算$\sum\limits _{i=1}^nk\: mod\:i$
通过观察易发现$k\%i=k-\left \lfloor \frac{k}{i} \right \rfloor*i$,因此我们考虑把$\left \lfloor \frac{k}{i} \right \rfloor$的值相同的$i$分成一组直接求和,复杂度为$O(\sqrt{n})$。
整除分块原理(选自某dalao博客)
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 typedef long long ll; 5 ll n,k; 6 7 int main() { 8 while(scanf("%lld%lld",&n,&k)==2) { 9 ll ans=0; 10 for(ll l=1,r; l<=n; l=r+1) { 11 r=k/l&&k/(k/l)<n?k/(k/l):n; 12 ans+=k*(r-l+1)-(k/l)*((l+r)*(r-l+1)/2); 13 } 14 printf("%lld\n",ans); 15 } 16 return 0; 17 }