BZOJ1257(CQOI2007)[余数之和sum]--分块+等差数列

来源:互联网 发布:免费物流软件 编辑:程序博客网 时间:2024/06/05 21:09

【链接】
bzoj1257

【解题报告】

n mod m = nnnm

所以就想到了分块,将nm相同的分成一个块。

然后对于每个块求一遍等差数列就行了。

#include<cstdio>#include<cmath>#define LL long longusing namespace std;int n,m,S;LL ans;int main(){    freopen("1257.in","r",stdin);    freopen("1257.out","w",stdout);    scanf("%d%d",&m,&n); S=sqrt(n); ans=0;    if (m>n) ans+=(LL)(m-n)*n,m=n;    for (int i=1; i<=S&&i<=m; i++) ans+=n%i;    if (m<=S) return printf("%lld",ans),0;    for (int i=1; i<=S; i++)    {        int L=n/(i+1)+1,R=n/i;        if (L<S+1) L=S+1; if (R>m) R=m;        if (L>R) continue;        ans+=(LL)(n%L+n%R)*(R-L+1)/2;    }    printf("%lld",ans);    return 0;}
原创粉丝点击