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]余数求和的主要内容,如果未能解决你的问题,请参考以下文章

题解 P2261 [CQOI2007]余数求和

P2261 [CQOI2007]余数求和

P2261 [CQOI2007]余数求和

P2261 [CQOI2007]余数求和

P2261 [CQOI2007]余数求和

洛谷P2261[CQOI2007]余数求和