#include <bits/stdc++.h>
typedef struct {
  int a;
  int b;
} abc086b_t;
int concatenate(const abc086b_t* given_data) {
  if ((*given_data).b < 10)
    return 10 * (*given_data).a + (*given_data).b;
  else if ((*given_data).b < 100)
    return 100 * (*given_data).a + (*given_data).b;
  else
    return 1000 * (*given_data).a + (*given_data).b;
}
bool IsSquare(const abc086b_t* given_data) {
  const unsigned int concatenated = concatenate(given_data);
  unsigned int iter = 1;
  unsigned int iter_square = iter * iter;
  while (iter_square <= concatenated) {
    if (iter_square == concatenated) {
      return true;
    } else {
      ++iter;
      iter_square = iter * iter;
    }
  }
  return false;
}
void ABC086B(const abc086b_t* given_data) {
  if (IsSquare(given_data))
    printf("Yes\n");
  else
    printf("No\n");
}
int main(void) {
  abc086b_t given_data;
  int retval_scanf;
  retval_scanf = scanf("%d %d", &given_data.a, &given_data.b);
  ABC086B(&given_data);
  return EXIT_SUCCESS;
}
