暴力求解:时间复杂度太高了。数比较大时,很耗费时间。
只要算法学好,学什么语言都快
![](https://img-blog.csdnimg.cn/0e9d6c73f5a147c59197399b25999c81.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAd2VpeGluXzUxNjY2NTA1,size_19,color_FFFFFF,t_70,g_se,x_16)
step1: 在k==0,count=n*n;
当k>0,
step2: 在
y
的整数倍区间内,
x
符合条件的数量就是
(n / y) * (y - k)
个
n / y 表示有多少个完整的 0 ~ y
区间,
y - k
表示有每个区间内有多少个符合条件的数字
step3: n % y
就是多出完整区间部分的数字个数,其中
k
以下的不用考虑,则符合条件的是
n % y - (k-1)
个
finally: 最终公式:
(n / y) * (y - k) + ((n % y < k) ? 0, (n % y - k + 1));
#include<stdio.h>
void test3()
{
long n=0,k=0;
while(~scanf("%ld %ld",&n,&k))
{
if(k==0)
{
printf("%ld\n",n*n);
continue;
}
long count = 0;
for(long y = k + 1; y <= n; y++)
{
count += ((n / y) * (y - k)) + ((n % y < k) ? 0 : (n % y - k + 1));
}
printf("%ld\n", count);
}
}
int main()
{
test3();
return 0;
}
有问题可在评论指出,觉得还行就给个赞和关注吧
也可以关注这个系列,后续也会有更新,和其他代码产出