#include<bits/stdc++.h>
using namespace std; 
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define rep1(i, n) for (int i = 1; i < (int)(n); i++)
#define length size()
#define int long long
#define ll long long
#include <cstdint>
long long modpow(long long a, long long n, long long mod) {
    long long res = 1;
    while (n > 0) {
        if (n & 1) res = res * a % mod;
        a = a * a % mod;
        n >>= 1;
    }
    return res;
}
const int MOD = 1000000007;
const int mod = 1000000007;
const int MAX = 510000;
const double inf = 900719925474099;
template<typename T> string join(vector<T> &vec ,const string &sp){
    int si = vec.length;
    if(si==0){
        return "";
    }else{
        stringstream ss;
        rep(i,si-1){
            ss << vec[i] << sp;
        }
        ss << vec[si - 1];
        return ss.str();
    }
}
vector<vector<int>> ruiseki2d(vector<vector<int>> vec){
    rep(i,vec.size()-1){
        rep(j,vec[0].size()-1){
            vec[i+1][j+1] = vec[i][j+1]+vec[i+1][j]-vec[i][j]+vec[i+1][j+1];
        }
    }
    return vec;
}
vector<int> ruiseki(vector<int> vec){
    rep(i,vec.size()-1){
        vec[i+1] += vec[i];
    }
    return vec;
}
signed main(void){
    int a,b;
    cin >> a >> b;
    bool flag = false;
    for(int i=1;sqrt(b)>=i;i++){
        if(b%i!=0) continue;
        if((i+(b/i))==a){
            flag = true;
        }
    }
    cout << ((flag)?"Yes":"No") << endl;
}

#include <bits/stdc++.h>
using namespace std;

int main() {
    int64_t S, P;
    cin >> S >> P;
    for (int64_t N = 1; N * N <= P; N++) {
        if (P % N != 0) {
            continue;
        }

        int64_t M = P / N;
        if (N + M == S) {
            cout << "Yes" << endl;
            return 0;
        }
    }

    cout << "No" << endl;
}