// Rain Dreamer MODEL // iSea @ 2014-08-24 19:31 // Comment - #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; // Self Template Code BGEIN #define sz(x) ((int)((x).size())) #define out(x) printf(#x" %d\n", x) #define rep(i,n) for (int i = 0; i < (n); ++i) #define repf(i,a,b) for (int i = (a); i <= (b); ++i) #define repd(i,a,b) for (int i = (a); i >= (b); --i) #define repcase int t, Case = 1; for (scanf ("%d", &t); t; --t) #define repeach(i,x) for (__typeof((x).begin()) i = (x).begin(); i != (x).end(); ++i) typedef long long int64; typedef pair pii; int sgn(double x) { return (x > 1e-8) - (x < -1e-8); } int count_bit(int x) { return x == 0? 0 : count_bit(x >> 1) + (x & 1); } template inline void ckmin(T &a, const T b) { if (b < a) a = b; } template inline void ckmax(T &a, const T b) { if (b > a) a = b; } // Self Template Code END bool can(int sq, int n, int k) { int avoid_num = n - sq; int mins = k * (k + 1) / 2; if (n < mins) { return false; } if (avoid_num <= k - 1) { return true; } int left_mins = k * (k - 1) / 2; if (sq < left_mins) { return false; } int dif = avoid_num - (k - 1); if (sq - left_mins != dif) { return true; } return dif != 1; } int main() { int n, k; while (scanf ("%d%d", &n, &k) != EOF) { bool flag = false; for (int i = 1; i * i < n; ++i) { if (can(i * i, n, k)) { // printf ("can %d %d\n", i * i, n); flag = true; break; } } puts (flag? "YES" : "NO"); } return 0; }