您的位置:首页 > 其它

bzoj1257 [CQOI2007]余数之和sum

2017-03-28 11:29 281 查看

Description

给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值,其中k mod i表示k除以i的余数。例如j(5, 3)=3 mod 1 + 3 mod 2 + 3 mod 3 + 3 mod 4 + 3 mod 5=0+1+0+3+3=7

Input

输入仅一行,包含两个整数n, k。

Output

输出仅一行,即j(n, k)。

Sample Input

5 3

Sample Output

7

HINT

50%的数据满足:1<=n, k<=1000 100%的数据满足:1<=n ,k<=10^9

正解:数学+分块。

$k \bmod i=k-\left \lfloor \frac{k}{i} \right \rfloor*i$,然后直接数论分块即可。

注意$k<n$加特判。

//It is made by wfj_2048~
#include <algorithm>
#include <iostream>
#include <complex>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#define inf (1<<30)
#define il inline
#define RG register
#define ll long long
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)

using namespace std;

ll n,k,lim,pos,ans;

il void work(){
cin>>n>>k; lim=min(n,k);
if (n>k) ans+=k*(n-k);
for (RG ll i=1;i<=lim;i=pos+1){
pos=k/(k/i); if (pos>lim) pos=lim;
ans+=(pos-i+1)*k-(k/i)*((i+pos)*(pos-i+1)>>1);
}
printf("%lld",ans); return;
}

int main(){
File("sum");
work();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: