题目链接:bzoj1257
题目大意:
给出正整数n和k,计算
Jkn=∑ni=1(kmodi)
的值。
题解:
数论..
化式子变成
Jkn=∑i=1n(k−i×⌊ki⌋)
即
Jkn=n×k−∑i=1ni×⌊ki⌋
于是就把 ⌊ki⌋ 相同的分成一块,对于同一块里的 i <script type="math/tex" id="MathJax-Element-149">i</script>一定是连续的。所以可以直接用求和公式进行计算。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
LL mymin(LL x,LL y){return (x<y)?x:y;}
int main()
{
//freopen("a.in","r",stdin);
//freopen("a.out","w",stdout);
LL n,k,i,l,r,mid,ret;
scanf("%lld%lld",&n,&k);
LL ans=n*k;
LL lim=mymin(k,n);
for (i=1;i<=lim;i=r+1)
{
LL x=k/i;r=mymin(k/x,lim);
ans-=x*(i+r)*(r-i+1)/2;
}
printf("%lld\n",ans);
return 0;
}