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

//to insert pair use eb or { }
#define int int64_t
typedef pair<int,int> pii;
const int X=1e9+7; 
const int inf=1e18;

#define lld        int
#define pqu        priority_queue
#define eb         emplace_back
#define mp         make_pair
#define fi         first
#define se         second
#define pb         push_back
#define endl       "\n"
#define v          vector
#define Y          998244353
#define EPS        1e-6
#define N          500005
#define pi         3.1415926535897932384626

#define ones(x)     __builtin_popcount(x)
#define zero(a)    memset(a,0,sizeof(a))
#define minus(a)   memset(a,-1,sizeof(a))
#define all(a)     (a).begin(),(a).end()

#define rec(i,s,e)   for(int i=s ; (s<=e)?(i<e):(i>=e) ; (s<=e)?(i++):(i--) )
// rec(i,0,n)
// rec(i,n-1,0)
//for flush dont use endl (\n)

void google(int i)
{  cout<<"Case #"<<i<<": "; }

//use sort function even to sort a string of caharacters or numbers ...
//  sort(s.begin(),s.end());

//floating precision functions 
//floor() for low 
//ceil() for above 
// trunc() removes decimal digits
//round() used to round off 
void prec(double n,int d) 
{ 
 cout<<fixed<<setprecision(d)<<n<<endl; 
}

//prime[i]==1 if it is prime 
int prime[1000001]; 
void sieve(int n) 
{ rec(i,0,n+1) 
    prime[i]=1; 
   for(int i=2;i*i<=n;i++) 
     { if(prime[i]!=1) 
          continue; 
         for(int j=i*i;j<=n;j=j+i) 
          if(prime[j]==1)
           prime[j]=i; 
      }
}

int gcd(int a,int b)
{
    if(a==0)
     return b; 
    return gcd(b%a,a); 
}

//fermat a^(m-2)%mod
int bin(int a,int n,int m)
{  int res=1; 
 while(n) 
  { if(n%2) 
      { res=(res*a)%m; 
         n--; 
      } 
     a=(a*a)%m; 
     n/=2; 
  }
  return res; 
}

void dijktra(v<pii> g[], int n)
{
  pqu<pii, v<pii>, greater<pii>> pq;
  v<int> dist(n, inf);
  dist[0] = 0;
  int parent[n];
  minus(parent); 
  pq.push({0, 0});

  while (!pq.empty())
  {
    pii x= pq.top();
    pq.pop();

    for(int i=0;i<(int)g[x.se].size();i++) 
    {
      pii k = g[x.se][i];
      if (dist[x.se] + k.fi < dist[k.se])
      {
        dist[k.se] = dist[x.se] + k.fi;
        parent[k.se] = x.se;
        pq.push({dist[k.se], k.se});
      }
    }
  }
}

void bfs(int s,v<int> g[],int n)
{ 
   bool vis[n]; 
   rec(i,0,n) 
    vis[i]=false; 
    
   vis[s]=true; 
   deque<int> q; 
   q.pb(s); 
   
   while(!q.empty()) 
   {  
      s=q.front(); 
     q.pop_front(); 
      
     for(int i=0;i<g[s].size();i++) 
      {  
        if(!vis[g[s][i]])
         { vis[g[s][i]]=true; 
            q.pb(g[s][i]); 
         }
      }
   }
}

void dfs(int u,v<int> g[],bool *vis)
{ 

   vis[u]=true; 
   for(int i=0;i<g[u].size();i++) 
     if(!vis[g[u][i]])
          dfs(g[u][i],g,vis); 
       
} 
void create_w(v<pii> *g, int n, int m)
{
  rec(i,0, m)
  {
    int u,v,w;
    cin>>u>>v>>w;
    g[u-1].pb({w, v-1});
    g[v-1].pb({w, u-1});
  }
}
void create(v<int> *g,int n,int m) 
{  
   rec(i,0,m) 
    {
       int u,v; 
       cin>>u>>v; 
       g[u-1].pb(v-1); 
       g[v-1].pb(u-1); 
    } 
}

//always use int
void contest(int t)
{
        int s,p;
    cin>>s>>p;
    
    rec(i,1,sqrt(p)+1)
    {
        if(p%i!=0)
         continue;
        if((i + (p/i)) == s)
         {
             cout<<"Yes"<<endl;
             return;
         }
         
    }
   
    cout<<"No"<<endl;
    
}
//remember rec


int32_t main()
{   
   ios_base::sync_with_stdio(false); 
   cin.tie(0); cout.tie(0);
     #ifdef PUNEET_GOEL
    //freopen("input.txt", "r", stdin);
    //freopen("output.txt", "w", stdout);
    #endif
    //sieve(1e6); 
    int T=1; 
    //cin>>T;
    rec(t,0,T) 
    {
      contest(t); 
    }
  return 0;
}
#include<bits/stdc++.h>
using namespace std;
int main(){
    long long s,p;
    cin>>s>>p;
    int ans=0;
    for(int i=1;i<=sqrt(p);i++)if(p%i==0 && i+p/i==s)ans=1;
    cout<<(ans ? "Yes" : "No")<<endl;
    return 0;
}