luogu2261余数求和题解--整除分块

Posted rye-catcher

tags:

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

题目链接

https://www.luogu.org/problemnew/show/P2261

分析

显然(k) (mod) (i=k-lfloor {k/i} floor) ( imes) (i),于是我们只需要求(N * k-sum_{i=1}^N {lfloor {k/i} floor imes i})

这里就需要数论分块,也称作整除分块的知识

结论:

(forall{i} in [x,lfloor {k/{lfloor {k/x} floor }} floor]),(lfloor k/i floor)的值都相等

证明

先咕了....

于是这道题再套个等差数列求和就完了...

代码

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cctype>
#define ll long long 
#define ri register int 
using std::min;
using std::max;
ll n,k,ans=0,g;
int main(){
    scanf("%lld %lld",&n,&k);
    ans=n*k;
    for(ri i=1;i<=n;i=g+1){
        g= k/i ? min(k/(k/i),n) : n;//如果i大于k的话直接一步把后面的算完 
        ans -= (i+g)*(g-i+1)/2 * (k/i); 
        //     等差数列求和      数论分块 
    }
    printf("%lld
",ans);
    return 0;
}

以上是关于luogu2261余数求和题解--整除分块的主要内容,如果未能解决你的问题,请参考以下文章

luogu2261 [CQOI2007]余数求和

Luogu P2261 [CQOI2007]余数求和

整除分块

Luogu2261 [CQOI2007]余数求和

Luogu P2261 [CQOI2007]余数求和

[CQOI2007]余数求和-整除分块