码迷,mamicode.com
首页 > 其他好文 > 详细

luogu2261 [CQOI2007]余数求和

时间:2018-03-04 21:18:56      阅读:109      评论:0      收藏:0      [点我收藏+]

标签:logs   down   函数   相等   body   pre   问题   post   floor   

除法分块。
猜想:\(g(x)=\lfloor k / \lfloor k / x\rfloor \rfloor\),则对于 \(i \in [x,g(x)]\)\(\lfloor k / i \rfloor\) 都相等。
证明: 显然函数 \(y=k/x\) 单调递减。显然 \(\lfloor k/x \rfloor \leq k/x\)。则:

  1. \(g(x)=\lfloor k / \lfloor k / x\rfloor \rfloor \geq \lfloor k/(k/x) \rfloor=x \Rightarrow \lfloor k/g(x) \rfloor \leq \lfloor k/x \rfloor\);
  2. \(\lfloor k/g(x) \rfloor=\lfloor k/\lfloor k / \lfloor k / x\rfloor \rfloor \rfloor \geq \lfloor k/( k / \lfloor k / x\rfloor ) \rfloor=\lfloor k/x \rfloor\)

于是 \(\lfloor k/g(x) \rfloor=\lfloor k/x \rfloor\)。则显然对于 \(i \in [x,g(x)]\)\(\lfloor k / i \rfloor\) 都相等。我们还可以知道 \(\lfloor k/(g(x)+1) \rfloor < \lfloor k/g(x) \rfloor=\lfloor k/x \rfloor\)

回到问题,\(ans=\sum_{i=1}^n k \bmod i=nk-\sum_{i=1}^{\min(n,k)} \lfloor k/i \rfloor \times i\),当 \(\lfloor k/i \rfloor\) 相等时对 \(i\) 用等差数列求和就好了。

#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
int n, k, lst, end;
ll ans=0;
int main(){
    cin>>n>>k;
    for(int i=1; i<=min(k,n); i=end+1){
        lst = k / i;
        end = min(n, k / lst);
        ans += (ll)lst * (end+i) * (end-i+1) / 2;
    }
    cout<<(ll)n*k-ans<<endl;
    return 0;
}

luogu2261 [CQOI2007]余数求和

标签:logs   down   函数   相等   body   pre   问题   post   floor   

原文地址:https://www.cnblogs.com/poorpool/p/8505618.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!