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

    Description

    给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值
    其中k mod i表示k除以i的余数。
    例如j(5, 3)=3 mod 1 + 3 mod 2 + 3 mod 3 + 3 mod 4 + 3 mod 5=0+1+0+3+3=7

    Input

    输入仅一行,包含两个整数n, k。
    1<=n ,k<=10^9

    Output

    输出仅一行,即j(n, k)。

    Sample Input

    5 3

    Sample Output

    7

    Solution 

    $x~mod~i=x-floor(x/i)*i$。
    发现对于相同的$floor(x/i)$可以放到一起用等差数列做。整除分块就是$sqrt(n)$的了。

    Code

     1 #include<iostream>
     2 #include<cstdio>
     3 #define LL long long
     4 using namespace std;
     5 LL n,k,ans,d,r;
     6 int main()
     7 {
     8     scanf("%lld%lld",&n,&k);
     9     if (n>k) ans+=(n-k)*k,n=k;
    10     ans+=n*k;
    11     for (LL l=1,r; l<=n; l=r+1)
    12     {
    13         r=min(k/(k/l),n);
    14         ans-=(l+r)*(r-l+1)/2*(k/l);
    15     }
    16     printf("%lld
    ",ans);
    17 }
  • 相关阅读:
    开发细节
    html
    java学习
    Promise对象
    强制转换和隐式转换
    借助防抖解决输入框的非空校验
    setTimeout
    Symbol类型
    js API
    vue 使用mixin
  • 原文地址:https://www.cnblogs.com/refun/p/9722427.html
Copyright © 2011-2022 走看看