看了前面3个人的题解,只看懂了枚举y的范围,最后结果超时,
枚举下的每个(y=k)++的数量,需要用简单的数学逻辑表达,这个表达自己手写数组才理解。
下图前后两种代码,第一种ng,第二种ok;
枚举下的每个(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下面简易暴力求解
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下面用逻辑求解,才能过关。
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;
}//暴力求解//暴力求解//暴力求解//暴力求解//暴力求解//暴力求解//暴力求解
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;
}//暴力求解//暴力求解//暴力求解//暴力求解//暴力求解//暴力求解//暴力求解