BZOJ1257 余数之和sum

来源:互联网 发布:小影怎么添加网络音乐 编辑:程序博客网 时间:2024/06/05 06:26

阈值优化???

题目传送门

对于x mod p,可以理解为x-p*(x/p)。不难发现存在区间[l,r],x/i的值都是相同的,因此sigma(x mod i (r>=i>l))的值就是一个等差数列。于是开始我们先把sum赋成n*m,然后减去每个区间的sigma(i*(x/i))即可。一直做到sqrt(n)。
但是算完后还有[1,n/(sqrt(n)+1)]这个区间没有用算,直接一遍算过去就好啦。
注意判断范围。

代码:

#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#define LL long longusing namespace std;LL n,m;int main(){    scanf("%lld%lld",&m,&n);    LL sum=n*m;    LL pd=sqrt(n);    for (int i=1;i<=pd;i++){        LL l=n/(i+1)+1,r=n/i;//枚举区间        if (l>m) continue;//判越界        if (r>m) r=m;        sum=sum-(l+r)*(r-l+1)/2*i;    }    for (int i=1;i<=n/(pd+1);i++) if (i<=m) sum=sum+n%i-n;    printf("%lld\n",sum);    return 0;}
原创粉丝点击