您的位置:首页 > 其它

【除法分块】BZOJ1257 [CQOI2007]余数之和sum

2017-08-20 16:04 281 查看
题面在这里

把答案的形式写出来就是这样的:

∑i=1mn−⌊ni⌋⋅i

nm−∑i=1m⌊ni⌋⋅i

可以发现,随着i的增长,⌊ni⌋是可以分块的

而且最多有O(n√)级别的块数

示例程序:

#include<cstdio>
#include<cmath>
#define LL long long

LL n,nn,m,ans,a[3162300];
int main(){
scanf("%lld%lld",&m,&n);nn=sqrt(n);
ans=n*(m);
for (int k=1;k<=nn;k++){
a[k]=n/k;
LL l=n/(k+1)+1,r=n/k;
if (l>m) continue;
if (r>m) r=m;
ans-=(k*((l+r)*(r-l+1)/2));
}
for (int i=1;i<nn;i++){
LL k=a[i],l=n/(k+1)+1,r=n/k;
if (l>m) continue;
if (r>m) r=m;
ans-=(k*((l+r)*(r-l+1)/2));
}
if (n/nn!=nn){
LL k=a[nn],l=n/(k+1)+1,r=n/k;
ans-=(k*((l+r)*(r-l+1)/2));
}
printf("%lld",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: