P2261 [CQOI2007]余数求和
Posted lltyyc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P2261 [CQOI2007]余数求和相关的知识,希望对你有一定的参考价值。
O(n) 算法可以60分,不用讲了吧...
考虑怎么加快速度
首先在不用“%”的情况下求余数应该懂吧
a%b = a - int(a/b) * b
int() 是向下取整的意思
那么题目要求 k%1 + k%2 + ... + k%n
就等于 k-int(k/1)*1 + k-int(k/2)*2 + ... + k-int(k/n)*n
整理一下
= k*n - (int(k/1)*1 + int(k/2)*2 + ... + int(k/n)*n)
然后我们发现 有一些 int(k/i) 是相等的
所以可以和在一起计算
对于相等的int(k/i)(设为x) 它们的和等于 x* ( 对于所有不同的 i , int(k/i)相等的 i 的总和)
不同的 int(k/i) 大概有 sqrt(k) 种
可以过
具体还是看代码吧
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> using namespace std; long long n,m,ans; int main() { cin>>n>>m; ans=n*m; for(long long l=1,r;l<=n;l=r+1) //l,r表示对于任意 l<=i<=r,int(k/i)都相等 { if(m/l) r=min(m/(m/l),n); else r=n; //求出r的大小 ans-=(m/l)* (r-l+1)*(r+l)/2; //(r-l+1)*(r-l)/2 就等于 l+ (l+1) + ... + r 的和 } cout<<ans; return 0; }
以上是关于P2261 [CQOI2007]余数求和的主要内容,如果未能解决你的问题,请参考以下文章