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

luogu2261余数求和题解--整除分块

时间:2018-09-14 20:00:05      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:--   using   要求   def   scan   分析   floor   相等   printf   

题目链接

https://www.luogu.org/problemnew/show/P2261

分析

显然\(k\) \(mod\) \(i=k-\lfloor {k/i}\rfloor\) \(\times\) \(i\),于是我们只需要求\(N * k-\sum_{i=1}^N {\lfloor {k/i}\rfloor\times i}\)

这里就需要数论分块,也称作整除分块的知识

结论:

\(\forall{i} \in [x,\lfloor {k/{\lfloor {k/x}\rfloor }}\rfloor]\),\(\lfloor k/i \rfloor\)的值都相等

证明

先咕了....

于是这道题再套个等差数列求和就完了...

代码

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cctype>
#define ll long long 
#define ri register int 
using std::min;
using std::max;
ll n,k,ans=0,g;
int main(){
    scanf("%lld %lld",&n,&k);
    ans=n*k;
    for(ri i=1;i<=n;i=g+1){
        g= k/i ? min(k/(k/i),n) : n;//如果i大于k的话直接一步把后面的算完 
        ans -= (i+g)*(g-i+1)/2 * (k/i); 
        //     等差数列求和      数论分块 
    }
    printf("%lld\n",ans);
    return 0;
}

luogu2261余数求和题解--整除分块

标签:--   using   要求   def   scan   分析   floor   相等   printf   

原文地址:https://www.cnblogs.com/Rye-Catcher/p/9648325.html

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