#include <bits/stdc++.h>
#define INF 1000000007
#define F first
#define S second
#define PB push_back
#define MP make_pair
#define REP(i,a,b) for (int i = a; i < b; i++)
 
using namespace std;
 
typedef long long ll;
typedef long long int  lli;
typedef long double ld;
typedef vector<int> vi;
typedef unordered_map<int,int> umi ;
typedef unordered_set<int> usi ;
typedef pair<int,int> pi;

struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        // http://xorshift.di.unimi.it/splitmix64.c
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};
void __print(int x) {cerr << x;}
void __print(long x) {cerr << x;}
void __print(long long x) {cerr << x;}
void __print(unsigned x) {cerr << x;}
void __print(unsigned long x) {cerr << x;}
void __print(unsigned long long x) {cerr << x;}
void __print(float x) {cerr << x;}
void __print(double x) {cerr << x;}
void __print(long double x) {cerr << x;}
void __print(char x) {cerr << '\'' << x << '\'';}
void __print(const char *x) {cerr << '\"' << x << '\"';}
void __print(const string &x) {cerr << '\"' << x << '\"';}
void __print(bool x) {cerr << (x ? "true" : "false");}

template<typename T, typename V>
void __print(const pair<T, V> &x) {cerr << '{'; __print(x.first); cerr << ','; __print(x.second); cerr << '}';}
template<typename T>
void __print(const T &x) {int f = 0; cerr << '{'; for (auto &i: x) cerr << (f++ ? "," : ""), __print(i); cerr << "}";}
void _print() {cerr << "]\n";}
template <typename T, typename... V>
void _print(T t, V... v) {__print(t); if (sizeof...(v)) cerr << ", "; _print(v...);}
#ifndef ONLINE_JUDGE
#define debug(x...) cerr << "[" << #x << "] = ["; _print(x)
#else
#define debug(x...)
#endif


 
 
//declare here -------------------------------------------------------------------------------
const int N =1e5+5 ;
bool ing(ld val){
	return ceil(val)==floor(val) ;

}
// solve here ---------------------------------------------------------------------------------

void solve(){
	 ld s,p ;
	 cin>>s>>p ;
	 ld D = s*s - (4*p) ;
	 ld b= -s ;
	 ld a= 1 ;
	 if( D <0 ){
	 	cout<<"No" ;
	 }

	 else{
	 	ld val= sqrt(D) ;
	 	debug(D,val) ;
	 	ld x = (-b + val) /(2*a) ;
	 	ld y=  (-b -val) /(2*a) ;
	 	debug(x,y) ;
	 	if(ing(x) && ing(y) && x>0 && y>0) cout<<"Yes" ;
	 	else cout<<"No" ;
	 }



}	 

 

//--------------------------------------------------------------------------------------------





int main(){
	#ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
	#endif
    ios::sync_with_stdio(0);
    cin.tie(0);
    long long test =1 ;
   	//cin>>test ;
    while(test--){
        solve() ;
        cout<<"\n" ;
    }
    return 0 ;
}
#include<bits/stdc++.h>
using namespace std;
int main()
{
     long long int i,s,p,j;
     cin>>s>>p;
     for(i=1;;i++){
               if(i*(s-i)==p){
                    cout<<"Yes\n";
                    return 0;
               }
       if(i*(s-i)>p){break;}
          }
     cout<<"No\n";
}

