AcWing - 199 - 余数之和 = 数论分块

Posted inko

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AcWing - 199 - 余数之和 = 数论分块相关的知识,希望对你有一定的参考价值。

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;

以上是关于AcWing - 199 - 余数之和 = 数论分块的主要内容,如果未能解决你的问题,请参考以下文章

bzoj 1257 [CQOI2007]余数之和——数论分块

bzoj1257: [CQOI2007]余数之和sum(数论)

《算法竞赛进阶指南》0x32约数 余数之和

197. 阶乘分解数论

[BZOJ1257][CQOI2007]余数之和sum

小凯的数字 数论