#3138 [CQOI2007]余数求和
题面
给出正整数
n
n
n和
k
k
k,计算
G
(
n
,
k
)
=
k
m
o
d
1
+
k
m
o
d
2
+
k
m
o
d
3
+
…
+
k
m
o
d
n
G(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n
G(n,k)=kmod1+kmod2+kmod3+…+kmodn的值,其中
k
m
o
d
i
k mod i
kmodi表示
k
k
k除以
i
i
i的余数。例如
G
(
10
,
5
)
=
5
m
o
d
1
+
5
m
o
d
2
+
5
m
o
d
3
+
5
m
o
d
4
+
5
m
o
d
5
…
…
+
5
m
o
d
10
=
0
+
1
+
2
+
1
+
0
+
5
+
5
+
5
+
5
+
5
=
29
G(10, 5)=5 mod 1 + 5 mod 2 + 5 mod 3 + 5 mod 4 + 5 mod 5 …… + 5 mod 10=0+1+2+1+0+5+5+5+5+5=29
G(10,5)=5mod1+5mod2+5mod3+5mod4+5mod5……+5mod10=0+1+2+1+0+5+5+5+5+5=29
20%: n,k <= 1000
40%: n,k <= 10^6
100% n,k <= 10^9
输入
输入格式: 两个整数n k
输出
答案
样例输入
10 5
样例输出
29
SOL
直接整除分块就行,看代码。
代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,k,ans;
signed main(){
scanf("%lld%lld",&n,&k);
ans=n*k;
for(int register l=1,r;l<=n;l=r+1){
if(k/l)r=min(k/(k/l),n);
else r=n;
ans-=(k/l)*(r-l+1)*(l+r)>>1;
}
printf("%lld",ans);
return 0;
}