题解 P2261 【[CQOI2007]余数求和】
这道蓝题是真的简短精炼
下面介绍一个方法:数论(整除)分块
对于单一的⌊n/i⌋,某些地方的值是相同的,并且呈块状分布
通过进一步的探求规律与推理以及打表与瞎猜,我们可以惊喜的发现一个规律,这些块状分布的值是有规律的
对于一个块,假设它的起始位置的下标为l,那么可以得到的是,它的结束位置的下标为⌊n/⌊n/l⌋⌋
这道题在更新r的只是有一个细节要注意:r<=n
调到心态崩溃才发现。。。
推荐blog:数论分块 有个小错误
代码:
#include<bits/stdc++.h>
#define fir(a, b, c) for(register ll a = b; a <= c; a ++)
#define ll long long
using namespace std;
ll n, k;
int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
scanf("%lld %lld", &n, &k);
ll ans = n*k;
for(ll l = 1ll, r = 0; l <= n; l = r + 1ll){
if(k/l == 0ll) r = n;
else r = min(k / (k / l), n);//这个min很重要
ans -= ((l+r)*(r-l+1ll)/2ll) * (k/l);
}
printf("%lld\n", ans);
return 0;
}