看了前面3个人的题解,只看懂了枚举y的范围,最后结果超时,
枚举下的每个(y=k)++的数量,需要用简单的数学逻辑表达,这个表达自己手写数组才理解。
下图前后两种代码,第一种ng,第二种ok;
#include<stdio.h>
int main()
{
    int n,k;
    while(~scanf("%d %d",&n,&k)){
        int x,y=k+1,tmptmp=0;
        while(y<=n){
            int t=n/y;
            int tmp=0;
        for(int i=k;i<=y;i++){
            if(i%y>=k) tmp++;
        }
            int tm=0;
            for(int i=t*y+1;i<=n;i++){
                if(i%y>=k) tm++;
            }
            tmp*=t;
            tmptmp+=(tmp+tm);
            y++;
        }
        printf("%d\n",tmptmp);
    }
    return 0;
}//每个y下面简易暴力求解



#include<stdio.h>
int main()
{
        int   n,k;
        scanf("%d %d",&n,&k);
            long long tmptmp=0;
        if(0==k||1==k){
            tmptmp=(long long)n*n;
            printf("%lld",tmptmp);
            return 0;
        }
        int x,y=k+1;
        while(y<=n){
            int over=n/y;//一个步长下的遍历次数
            int num=n%y;//最后的尾数
            int m=over*(y-k);//所有步长下的个数
            int mm=num-k+1;//最后一个步长下的个数
            if(num<k){tmptmp+=m;}//不考虑尾数
            else {tmptmp+=(m+mm);}
            y++;
        }
        printf("%lld\n",tmptmp);
   
    return 0;
}//每个y下面用逻辑求解,才能过关。





-----------------------------------------------------------------



#include<stdio.h>
int main()
{
    int n,k,count=0;
    scanf("%d %d",&n,&k);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(i%j>=k) count++;
        }
    }
    printf("%d",count);
    return 0;
}//暴力求解//暴力求解//暴力求解//暴力求解//暴力求解//暴力求解//暴力求解