数对的个数

目录

1.题目

2.题目详解 

3.代码

4.总结


1.题目

牛牛在老师那里得到了一个正整数数对(x, y), 牛牛忘记他们具体是多少了。

但是牛牛记得老师告诉过他x和y均不大于n, 并且x除以y的余数大于等于k。

牛牛希望你能帮他计算一共有多少个可能的数对。

输入:

输入包括两个正整数n,k(1 <= n <= 10^5, 0 <= k <= n - 1)。

输出:

一个正整数表示可能的数对数量。

例:输入:5   2

       输出:7


2.题目详解 

我们可以将x分为1-y,  y+1-2y,  2y+1-3y.........如图

 同时余数也可以这样划分:

这时我们发现(x,y)有多少对,可以通过(y-k)*(n/y)+最后一行满足条件的来计算

这时我们只需要关注Y的值即可,让Y从K+1开始循环,到Y=N结束。

在就后加上最后一行满足的数量即可。

3.代码

数对的个数/源.c · 风夏/C语言进阶 - 码云 - 开源中国 (gitee.com)

#define  _CRT_SECURE_NO_WARNINGS 1
//牛牛以前在老师那里得到了一个正整数数对(x, y), 牛牛忘记他们具体是多少了。
//但是牛牛记得老师告诉过他x和y均不大于n, 并且x除以y的余数大于等于k。
//牛牛希望你能帮他计算一共有多少个可能的数对。
//
//输入描述:
//输入包括两个正整数n, k(1 <= n <= 10 ^ 5, 0 <= k <= n - 1)。
//输出描述:
//对于每个测试用例, 输出一个正整数表示可能的数对数量。
#include<stdio.h>
int main()
{
    int n = 0;
    int k = 0;
    unsigned long long count = 0;
    scanf("%d %d", &n, &k);
    int y = 0;
    if (k == 0)
        count = (long long)n * n;
    else
    {
        for (y = k; y <= n; y++)
        {
            count += (y - k) * (n / y);
            if (n % y - k + 1 > 0)
                count += n % y - k + 1;
        }
    }
    printf("%lld\n", count);
    return 0;

}

4.总结

希望大家越学越精通,你的点赞是我创作的动力!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值