题目描述:
求 Ans=(K%1)+(K%2)+…+(K%n)
题目分析:
这题目应该算是数论里比较简单的了
求
∑ni=1k mod i
∑
i
=
1
n
k
m
o
d
i
我们知道 a%b=a-b*(a/b)
即
∑ni=1k mod i=∑ni=1[k−i∗(k/i)]=n∗k−∑ni=1i∗(k/i)
∑
i
=
1
n
k
m
o
d
i
=
∑
i
=
1
n
[
k
−
i
∗
(
k
/
i
)
]
=
n
∗
k
−
∑
i
=
1
n
i
∗
(
k
/
i
)
数论中枚举形如 n/i的式子时 很大一部分 n/i 是连续不变的 我们可以分块搞 而前面的 i 的和就可以用 等差数列求和公式求出来
分块已经是套路了TAT
题目链接:
Ac 代码:
#include <iostream>
#include <cstdio>
#define ll long long
int main()
{
ll n,k;
scanf("%lld%lld",&n,&k);
ll ans=n*k;
ll last=0;
for(ll i=1;i<=n;i=last+1)
{
if((k/i)!=0) last=std::min(n,(k/(k/i)));
else last=n;
ans-=(last-i+1)*(last+i)/2*(k/i);
}
printf("%lld\n",ans);
return 0;
}