P2261 [CQOI2007]余数求和

该文章描述了一个编程竞赛中的数学问题,即计算G(n,k)=Σ(i=1ton)(kmodi),并提供了一个C++代码示例来解决这个问题。给定正整数n和k,程序通过循环和数学技巧求解总和并输出结果。对于不同规模的数据,有不同的性能要求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[CQOI2007]余数求和

题目描述

给出正整数 nnnkkk,请计算

G(n,k)=∑i=1nk mod iG(n, k) = \sum_{i = 1}^n k \bmod iG(n,k)=i=1nkmodi

其中 k mod ik\bmod ikmodi 表示 kkk 除以 iii 的余数。

输入格式

输入只有一行两个整数,分别表示 nnnkkk

输出格式

输出一行一个整数表示答案。

样例 #1

样例输入 #1

10 5

样例输出 #1

29

提示

样例 1 解释

G(10,5)=0+1+2+1+0+5+5+5+5+5=29G(10, 5)=0+1+2+1+0+5+5+5+5+5=29G(10,5)=0+1+2+1+0+5+5+5+5+5=29

数据规模与约定
  • 对于 30%30\%30% 的数据,保证 n,k≤103n , k \leq 10^3n,k103
  • 对于 60%60\%60% 的数据,保证 n,k≤106n, k \leq 10^6n,k106
  • 对于 100%100\%100% 的数据,保证 1≤n,k≤1091 \leq n, k \leq 10^91n,k109
#include <bits/stdc++.h>
#define LL long long 
using namespace std;
const int maxn = 1e6 + 10;
const int mod = 1e9 + 7;
const int INF = 1e9 + 10;
const int N = 1e6;
LL n,k;
int main(){
    cin >> n >> k;
    LL ans = n * k;
    for(int l = 1,r;l <= n;l = r + 1)
    {
        if(k/l != 0)
            r = min(k/(k/l),n);
        else
            r = n;
        ans -= (k / l) * (l + r) * (r - l + 1)/2;
    }
    cout << ans << endl;
    system("pause");
    return 0;
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值