CodeDance2023 2024-02-21 01:08 采纳率: 96%
浏览 7
已结题

余数和的k/i重复区间细节问题

img


#include <iostream>
using namespace std;
//这个答案错误
int main()
{
    long long n,k,sum = 0,L,R;
    cout << "输入j(n,k)的n和k:";
    cin >> n >> k;
    for (long long i = 1; i <= n;)
    {
        if (k / i == 0)
        {
            break;
        }
        L = i;                        //k/i相等的左区间默认为第一个数
        R = min(n, k/(k/i));             //观察发现右区间为k/(k / i),针对n有可能小于k,运用min函数保证右区间小于等于N
        for (long long j = L; j <= R; j++)      //给这个区间的就i*k/i求和
        {
            sum = sum + j * (k / i);
        }
        i = R + 1;      
        
    }
    cout << n * k - sum;
    return 0;
}
//这个答案正确
#include <iostream>
using namespace std;
typedef long long ll;
int main() {
    ll n, k;
    cin >> n >> k;
    ll sum = n * k; // 通过公式推导出来的,该数为基数,然后减去对应的数就行了。
    for (ll i = 1; i <= n;) { // 一共有n个数需要求余累加
        if (k / i == 0) break; // 如果k/i等于0,直接结束
        ll l = i; // 左边界
        ll r = min(n, k / (k / i)); // 右边界如果超过n,就取n
        sum -= (k / i) * (l + r) * (r - l + 1) / 2; // sum 减去这一块的值
        i = r + 1; // 更新i的值,跳过这一块
    }
    cout << sum << endl; // 输出结果
    return 0;
}

这两个代码的差别就是在求k/i有区间重复时候的求法不同,一个利用公式,一个利用循环,但是我输入了好几个样例来,这两个代码的结果都是一样的,请问为什么

  • 写回答

4条回答 默认 最新

  • 智者知已应修善业 2024-02-21 04:00
    关注

    重复区域用乘法,非重复区域用循环,极大减小循环次数,同时,也是正确的分治算法.

    img

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 3月4日
  • 已采纳回答 2月25日
  • 创建了问题 2月21日

悬赏问题

  • ¥15 求京东批量付款能替代天诚
  • ¥15 slaris 系统断电后,重新开机后一直自动重启
  • ¥15 51寻迹小车定点寻迹
  • ¥15 谁能帮我看看这拒稿理由啥意思啊阿啊
  • ¥15 关于vue2中methods使用call修改this指向的问题
  • ¥15 idea自动补全键位冲突
  • ¥15 请教一下写代码,代码好难
  • ¥15 iis10中如何阻止别人网站重定向到我的网站
  • ¥15 滑块验证码移动速度不一致问题
  • ¥15 Utunbu中vscode下cern root工作台中写的程序root的头文件无法包含