#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int n,m;
vector<int> add(vector<int> a,vector<int> b){
int t=0;
vector<int>res;
for(int i=0;i<a.size()||i<b.size();i++){
if(i<a.size())t+=a[i];
if(i<b.size())t+=b[i];
res.push_back(t%10);
t/=10;
}
if(t)res.push_back(1);
return res;
}
vector<int> sub(vector<int> a,vector<int> b){
int t=0;
vector<int>res;
for(int i=0;i<a.size();i++){
t=a[i]-t;
if(i<b.size())t-=b[i];
res.push_back((t+10)%10);
if(t<0)t=1;
else t=0;
}
while(res.size()>1&&res.back()==0)res.pop_back();
return res;
}
//高精度x低精度
vector<int> mul(vector<int> a,int b){
int t=0;
vector<int>res;
for(int i=0;i<a.size()||t;i++){
if(i<a.size())t+=a[i]*b;
res.push_back(t%10);
t/=10;
}
return res;
}
//高精度x高精度
vector<int> mul(vector<int> A, vector<int> B) {
vector<int>C(A.size()+B.size()+100,0);
int t = 0;
for(int i=0;i<A.size();i++) {
for(int j=0;j<B.size();j++) {
C[i+j]+=A[i]*B[j];
}
}
for(int i=0;i<C.size();i++) {
t+=C[i];
C[i]=t%10;
t/=10;
}
while(C.size()>1&&C.back()==0)C.pop_back();
return C;
}
vector<int> A(int a,int b){
vector<int> k;
k.push_back(1);
for(int i=a,j=b;i>=1;i--,j--){
k=mul(k,j);
}
return k;
}
vector<int> a,b,c,d,e,f,g;
int main(){
cin>>n>>m;
if(n+3>=m){//这两个限制条件
a=A(m,n+3);
b=A(n+2,n+2);
c=mul(a,b);
g=add(g,c);//g+=c;
}
if(n+2>=m){
d=mul(A(n+1,n+1),2);
e=A(m,n+2);
f=mul(d,e);
g=sub(g,f);//g-=f;
}
for(int i=g.size()-1;i>=0;i--){
cout<<g[i];
}
return 0;
}