,,数论分块主要用于求式子中含有一类的式子,因为不难发现,其中存在若干段连续区间内的值是一定,因此可以用O()的时间复杂度求出结果
题目的式子为,那么可以把这个式子用模除的本质进行拆解,可得,可知左侧的值可以直接求出,右侧的值同数论分块中式子的形式,那么我们只需要求一段含有相同数的区间的左右端点,然后就很容易可以得出结果,那么区间的左端点就是,区间的右端点则是,最后我们只需要求出这段区间内i的平均值以及区间内有多少个数,再乘上这段区间所含有的相同的数,就是这段区间的计算结果,最后减去所有的区间的结果就是最终答案
AC代码:
#include <bits/stdc++.h> #define rep(i,a,n) for(int i=a;i<n;i++) using namespace std; using LL = long long; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); LL n, k; cin >> n >> k; LL ans = n * k; for (LL l = 1, r; l <= n; l = r + 1) { if (k / l == 0) { r = n; } else { r = min(n, (k / (k / l))); } ans -= k / l * (r - l + 1) * (l + r) / 2; } cout << ans << '\n'; return 0; }
商的取值个数与数论分块
最新推荐文章于 2024-08-03 18:36:56 发布