https://www.acwing.com/problem/content/201/
要注意这次的数论分块里面是有一个上界n的,对k进行分块的时候l和r都不能超过n。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll s1(ll n) {
return n * (n + 1) / 2;
}
ll calc(ll n, ll k) {
ll ans = n * k;
//cout<<"ans="<<ans<<endl;
ll res = 0;
ll N = min(n, k);
for(ll l = 1, r; l <= N; l = r + 1) {
r = min(N, k / (k / l));
//printf("[%lld,%lld]\n",l,r);
res += (s1(r) - s1(l - 1)) * (k / l);
}
return ans - res;
}
int main() {
#ifdef Yinku
freopen("Yinku.in", "r", stdin);
#endif // Yinku
int n, k;
while(~scanf("%d%d", &n, &k)) {
printf("%lld\n", calc(n, k));
}
return 0;
}
本文深入探讨了数论分块算法的实现细节,通过一个具体的ACM竞赛题目,讲解了如何利用数论分块算法优化求解过程,特别是在面对大规模数据时的效率提升。文章提供了完整的C++代码示例,包括核心的s1和calc函数,以及主函数的读取输入和调用算法部分。
491

被折叠的 条评论
为什么被折叠?



