• Acwing199 余数之和


    原题面:https://www.acwing.com/problem/content/201/

    题目大意:给出正整数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)。

    输入样例:

    5 3

    输出样例:

    7                            

    分析:k%i=k-[k/i]i,所以原式可以化简为nk-(1<=i<=n)[k/i]*i。反正最后划来划去可以得到[x,[k/[k/x]]]区间内,[k/i]的值都相等。最后就是多个等差数列求和的问题。

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    int main() {
        ll n, k;
        scanf("%lld%lld", &n, &k);
        ll ans = n * k;
        for (int x = 1, gx; x <= n; x = gx + 1) {
            gx = k / x ? min(k / (k / x), n) : n;
            //[x,[k/[k/x]]]
            ans -= (k / x) * (x + gx) * (gx - x + 1) / 2;//第一项为(k/x)*x*(gx-x+1),最后一项为(k/x)*gx*(gx-x+1),此为一个等差数列区间
        }
        cout << ans << endl;
        return 0;
    }
  • 相关阅读:
    requireJS搭建
    html启动本地.exe文件
    自定义input[type="checkbox"]的样式
    使用rem单位时css sprites的坑
    visibility API
    css动画
    去除ios端输入框的弹出
    *java类的生命周期
    处理高并发,防止库存超卖
    java注解的使用
  • 原文地址:https://www.cnblogs.com/SwiftAC/p/12110792.html
Copyright © 2020-2023  润新知