循环没有取得那个数即可,判断可以使用贪心很好判断,如果最后一个数是j(j<=k-1)则前面数至少为1....j-1,j+1,,,k-1即可,其他的类似。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int get(int p){
int k;
k=(int )sqrt(p*1.0);
for(int i=max(1,k-3);i<=k+3;i++){
if(p==i*i) return 1;
}
return 0;
}
int main()
{
int j,n,p,k,t;
while(cin>>n>>k){
if(n<k*(k+1)/2){
printf("NO\n");
continue;
}
p=k*(k-1)/2;
t=0;
for(j=1;j<=n-p;j++){
if(j==k){
if(n-j==(k)*(k-1)/2+1) continue;
else{
if(get(n-j)){
t=1;
break;
}
}
continue;
}
if(j>=k){
if(get(n-j)){
t=1;
break;
}
}
else{
if(n-j<(j)*(j-1)/2+(k+j+1)*(k-j)/2) continue;
if(get(n-j)){
t=1;
break;
}
}
}
if(t) printf("YES\n");
else printf("NO\n");
}
}