zoukankan      html  css  js  c++  java
  • AcWing 199. 余数之和 (除法分块)打卡

    给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值。

    例如j(5, 3)=3 mod 1 + 3 mod 2 + 3 mod 3 + 3 mod 4 + 3 mod 5=0+1+0+3+3=7。

    输入格式

    输入仅一行,包含两个整数n, k。

    输出格式

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

    数据范围

    1n,k1091≤n,k≤109

    输入样例:

    5 3
    

    输出样例:

    7



    题意:求题目所给的等式
    思路:直接O(n)遍历肯定不行,我们尝试优化,首先我们 n%p = n - n/p*p 我们就可以把原式变成 n*p - 累加(1-m) n/i*i;
    然后再利用除法分块原理能知道一段区间的除法值是一样的,然后用等差数列求和,然后得出值

    除法分块:
    begin=i;
    end=n/(n/i);
    首先n/i是被除后的值,然后我要最大的除值的最大下标位置,肯定是拿总和除以值就得出下标位置所在

    #include<bits/stdc++.h>
    #define maxn 200005
    #define mod 1000000007
    using namespace std;
    typedef long long ll;
    ll n,m;
    int main(){
        cin>>m>>n;
        ll x=n*m;
        ll sum=0;
        if(m>=n){
            m=n;
        } 
        for(int i=1;i<=m;i=n/(n/i)+1){
            ll q=n/(n/i);    
            q=min(q,m);
            ll z=(i+q)*(q-i+1)/2;
            sum+=z*(n/i);
        }
        cout<<x-sum;
    }


  • 相关阅读:
    在中文版VS2008中安装MVC
    【原创】最优惠的企业邮局
    【推荐】双模虚拟主机 WINDOWS经济型或 UNIX经济型
    CSS基础
    第一篇文章
    一道面试题
    IIS做web server有些中文名文件不能下载
    偶遇指间流沙
    迷失的女孩
    身边的小故事二则
  • 原文地址:https://www.cnblogs.com/Lis-/p/11000920.html
Copyright © 2011-2022 走看看