题意:输入$k,n$,求$\sum_{i=1}^n k \mod i$
$k \mod i=k-i*\lfloor \frac{k}{i} \rfloor $,$n$个$k$直接求和,后面那个东西像比较套路的分段求和
算k/(k/i)这种东西的时候还要注意判一下分母为0什么的…
#include<cstdio> typedef long long lint; lint n,k,ans; inline lint min(lint a,lint b){return a<b?a:b;} inline lint getsum(lint i) { return i*(i+1)/2; } int main() { scanf("%lld%lld",&n,&k); ans=n*k; for(register lint i=1,pos;i<=n;i=pos+1) { pos=(k/i?min(n,k/(k/i)):n); ans-=(getsum(pos)-getsum(i-1))*(k/i); } printf("%lld",ans); return 0; }
本文探讨了输入k,n条件下,求解∑(k mod i)从i=1到n的算法实现。通过分析k mod i的数学表达,提出了一种分段求和的策略,并给出了具体的C++代码实现,包括关键的getsum函数用于快速计算等差数列之和。
225

被折叠的 条评论
为什么被折叠?



