标签:lfloor right frac int P2261 rfloor ans 余数 CQOI2007
分析
求的式子为\(ans = \sum_{i=1}^{n} k\%i\),我们首先需要知道的是\(a\%b=a-b*\left \lfloor \frac{a}{b} \right \rfloor\),则式子就变成了。
\[ans = n*k -\sum_{i=1}^{n}i*\left \lfloor \frac{k}{i} \right \rfloor \]然后\(\left \lfloor \frac{k}{i} \right \rfloor\),可以用整数分块做,这样时间复杂度就降到\(\sqrt{k}\)
中间有一些小的限制,我会在代码中写出来。
Ac_code
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int g(int x,int l)//边界为x,该块边界为l
{
return x/(x/l);
}
int main()
{
int n,k;cin>>n>>k;
LL ans = 0;
if(n>k)
{
ans += 1ll*(n-k)*k;
n = k;
}
ans += 1ll*n*k;
for(int l=1,r;l<=n;l=r+1)
{
r = min(g(k,l),n);
ans -= 1ll*(l+r)*(r-l+1)/2*(k/l);
}
cout<<ans<<'\n';
return 0;
}
标签:lfloor,right,frac,int,P2261,rfloor,ans,余数,CQOI2007 来源: https://www.cnblogs.com/aitejiu/p/16656475.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。