【BZOJ】1257: [CQOI2007]余数之和(除法分块)

题目

传送门:QWQ

 

 

分析

大佬和我说本题是除法分块,莫比乌斯反演中也有用到。

QwQ我不会莫比乌斯反演啊~

 

题目让我们求  $ \sum_{i=1}^n  k\mod n $

然后根据$ a \mod b = a - \left \lfloor \ \frac{a}{b} \right \rfloor \times b$

原式就变成了$ n*k - \sum_{i=1}^n \frac{k}{i} \times i$

发现$ \frac{k}{i} $在一定范围内是不变的,然后计算一下就能$ O(\sqrt{n}) $内解决了

 

代码

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 int main()
 5 {
 6     ll n,k,ans;
 7     scanf("%lld%lld",&n,&k); ans=n*k;
 8     for(ll l=1,r;l<=n;l=r+1){
 9         ll t=k/l;
10         
11         if(t) r=min(k/t,n);
12         else r=n;
13         ans-=(l+r)*(r-l+1)/2*t;
14     //    printf("--- %lld %lld %lld\n",l,r,(r-l+1)*(r-l)/2*t);
15     }
16     printf("%lld\n",ans);
17     return 0;
18 }

 

posted @ 2018-08-09 10:46  noble_(noblex)  阅读(237)  评论(0编辑  收藏  举报
/* */