数对(网易)

在这里插入图片描述

#include <iostream>
using namespace std;
typedef long long LL;
int main()
{
	LL n, k;
	cin >> n >> k;
	LL count = 0;
	if (k == 0)
		count = n*n;
	else {
		//注意到当除数是y时,当x=1~n时,余数是1,2,3,...,y-1,0循环出现,循环节长度显然是y
		//枚举y=k+1~n,y从k+1开始(如果y=k,那么取余最大才是k-1)
		//然后对于x=1~n,总共出现了[n/y]个循环节,然后数出每个循环节里面不小于k的余数(y-k个)。最后再数出不满一个循环节的不小于k的余数,就是答案了。
		for (LL y = k + 1; y <= n; y++)
		{
			LL temp = 0;
			temp = (n / y)*(y - k);
			if (n%y >= k)//最后一节是不满一个循环的节,而且最后一节里数的个数>=k
			{
				temp += n%y - k + 1;
			}
			count += temp;
		}
	}
	cout << count << endl;
	system("pause");
	return 0;
}
发布了212 篇原创文章 · 获赞 4 · 访问量 8807

猜你喜欢

转载自blog.csdn.net/ShenHang_/article/details/104474282