题目链接 https://cn.vjudge.net/problem/UVA-1363
【题意】
输入正整数
n,k(1<=n,k<=109)
n
,
k
(
1
<=
n
,
k
<=
10
9
)
计算
∑i=1nk mod i
∑
i
=
1
n
k
m
o
d
i
【思路】
当
n>k
n
>
k
时,余数始终为
k
k
当时,设
p=⌊ki⌋,k mod i=k−pi
p
=
⌊
k
i
⌋
,
k
m
o
d
i
=
k
−
p
i
如果有
⌊ki+1⌋=p,k mod (i+1)=k−p(i+1)=k−pi−p=k mod i−p
⌊
k
i
+
1
⌋
=
p
,
k
m
o
d
(
i
+
1
)
=
k
−
p
(
i
+
1
)
=
k
−
p
i
−
p
=
k
m
o
d
i
−
p
说明只要
k
k
除以 的整数部分相同,那么
k mod i
k
m
o
d
i
就会形成一个等差数列,用一次求和公式即可
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,k;
int main(){
while(scanf("%lld%lld",&n,&k)==2){
ll ans=0;
if(n>k){
for(ll L=1,R;L<=k;L=R+1){
R=k/(k/L);
ans+=(k%L+k%R)*(R-L+1)/2LL;
}
ans+=(n-k)*k;
}
else{
for(ll L=1,R;L<=n;L=R+1){
R=k/(k/L);
if(R<=n) ans+=(k%L+k%R)*(R-L+1)/2LL;
else ans+=(k%L+k%n)*(n-L+1)/2LL;
}
}
printf("%lld\n",ans);
}
return 0;
}