【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 }