码迷,mamicode.com
首页 > 其他好文 > 详细

UVALive - 3521 Joseph's Problem (整除分块)

时间:2019-02-08 15:44:02      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:its   uva   mit   求和   tar   printf   log   观察   type   

给定$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 }

 

UVALive - 3521 Joseph's Problem (整除分块)

标签:its   uva   mit   求和   tar   printf   log   观察   type   

原文地址:https://www.cnblogs.com/asdfsag/p/10356175.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!