zoukankan      html  css  js  c++  java
  • Bzoj 1257 [CQOI2007]余数之和 (整除分块)

    Bzoj 1257 [CQOI2007]余数之和 (整除分块)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1257
    一道简单题.
    题目要求:

    [sum_{i=1}^nx \% i = ]

    [sum_{i=1}^nk - i * [dfrac{k}{i}] = ]

    [n * k - sum_{i=1}^n i * [dfrac{k}{i}] ]

    后面这一部分可以用整除分块解决.
    需要注意的是.(k\%i(i > k)) 时,运用整除分块,程序会出错,因为除了(0),显然(i>k)时,不会对答案造成影响.整除分块的时候只需要枚举到(min(n,k))即可.
    还需要一点等差数列的知识.
    (l+(l+1)+(l+2)+(l+3)..r)
    这一部分的和就是((l + r) /2 * (r - l + 1))区间的平均值乘以区间元素个数.
    然后就做完了.
    时间复杂度:(O(sqrt n))
    CODE

    #include <iostream>
    #include <cstdio>
    #define ll long long
    
    ll ans,n,k;
    
    ll min(ll a,ll b) {return a > b ? b : a;}
    ll max(ll a,ll b) {return a > b ? a : b;}
    
    int main() {
        scanf("%lld%lld",&n,&k);
        ans = n * k;
        for(ll l = 1,r;l <= min(k,n);l = r + 1) {
            r = min( k / (k / l) , n );
            ans -= (k / l) * (r - l + 1) * (r + l) / 2;
        }
        printf("%lld",ans);
        return 0;
    }
    
  • 相关阅读:
    python获取前几天的时间
    协程
    python实现进制之间的转换
    爬虫学习博客
    python 将base64字符串还原为图片
    python进行md5加密
    初始Hibernate4
    Linux安装tomcat
    centOS7安装jdk
    centOS7安装mysql
  • 原文地址:https://www.cnblogs.com/tpgzy/p/9722100.html
Copyright © 2011-2022 走看看