目录
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.总结
希望大家越学越精通,你的点赞是我创作的动力!!