#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m;
const int maxlen=50000;
struct bignum{
string s;
int len,num[maxlen];
};
bignum reverse(string x){
bignum xx;
xx.len=x.size(),xx.s=x;
memset(xx.num,0,sizeof(xx.num));
for(int i=0;i<xx.len;i++) xx.num[i]=xx.s[xx.len-i-1]-'0';
return xx;
}
bool operator < (string x,string y){
if(x.size()<y.size()) return true;
if(x.size()>y.size()) return false;
if(x.size()==y.size()){
for(int i=0;i<x.size();i++){
if(x[i]<y[i]) return true;
if(x[i]>y[i]) return false;
}
return false;
}
}
bool operator > (string x,string y){
if(x.size()>y.size()) return true;
if(x.size()<y.size()) return false;
if(x.size()==y.size()){
for(int i=0;i<x.size();i++){
if(x[i]>y[i]) return true;
if(x[i]<y[i]) return false;
}
return false;
}
}
bool operator == (string x,string y){
if(x.size()!=y.size()) return false;
for(int i=0;i<x.size();i++) if(x[i]!=y[i]) return false;
return true;
}
bool operator <=(string x,string y){
return !(x>y);
}
bool operator >=(string x,string y){
return !(x<y);
}
bool operator !=(string x,string y){
return !(x==y);
}
string operator + (string x,string y){
bignum xx=reverse(x),yy=reverse(y),result;
memset(result.num,0,sizeof(result.num));
result.len=max(xx.len,yy.len);
for(int i=0;i<result.len;i++) result.num[i]+=xx.num[i]+yy.num[i],result.num[i+1]+=result.num[i]/10,result.num[i]%=10;
if(result.num[result.len]!=0) result.len++;
for(int i=0;i<result.len;i++) result.s+=result.num[result.len-i-1]+'0';
return result.s;
}
string operator - (string x,string y){
bignum xx=reverse(x),yy=reverse(y),result;
memset(result.num,0,sizeof(result.num));
if(x<y) swap(x,y),swap(xx,yy),result.s+="-";
result.len=max(xx.len,yy.len);
for(int i=0;i<result.len;i++){
result.num[i]+=xx.num[i]-yy.num[i];
if(result.num[i]<0) result.num[i]+=10,result.num[i+1]--;
}
while(result.num[result.len-1]==0&&result.len>1) result.len--;
for(int i=0;i<result.len;i++) result.s+=result.num[result.len-i-1]+'0';
return result.s;
}
string operator * (string x,string y){
bignum xx=reverse(x),yy=reverse(y),result;
memset(result.num,0,sizeof(result.num));
result.len=xx.len+yy.len;
for(int i=0;i<xx.len;i++) for(int j=0;j<yy.len;j++) result.num[i+j]+=xx.num[i]*yy.num[j];
for(int i=0;i<result.len;i++) result.num[i+1]+=result.num[i]/10,result.num[i]%=10;
while(result.num[result.len-1]==0&&result.len>1) result.len--;
for(int i=0;i<result.len;i++) result.s+=result.num[result.len-i-1]+'0';
return result.s;
}
string operator * (string x,int y){
bignum xx=reverse(x),result;
memset(result.num,0,sizeof(result.num));
result.len=xx.len+to_string(y).size();
for(int i=0;i<xx.len;i++) result.num[i]=xx.num[i]*y;
for(int i=0;i<result.len;i++) result.num[i+1]+=result.num[i]/10,result.num[i]%=10;
while(result.num[result.len-1]==0&&result.len>1) result.len--;
for(int i=0;i<result.len;i++) result.s+=result.num[result.len-i-1]+'0';
return result.s;
}
string operator * (int y,string x){
return x*y;
}
string operator / (string x,string y){
bignum result;
memset(result.num,0,sizeof(result.num));
int l=0;
while(y.size()<x.size()) y+="0",l++;
for(int i=0;i<=l;i++){
int k=0;
while(x>=y) x=x-y,k++;
y=y.substr(0,y.size()-1);
result.num[i]=k;
}
for(int i=0;i<=l;i++) if(!(result.s.empty()&&result.num[i]==0)) result.s+=result.num[i]+'0';
if(result.s.empty()) result.s="0";
return result.s;
}
string operator / (string x,int y){
int k=0;
bignum xx=reverse(x),result;
memset(result.num,0,sizeof(result.num));
result.len=xx.len;
for(int i=xx.len-1;i>=0;i--) result.num[i]=(k*10+xx.num[i])/y,k=(k*10+xx.num[i])%y;
while(result.num[result.len-1]==0&&result.len>1) result.len--;
for(int i=0;i<result.len;i++) result.s+=result.num[result.len-i-1]+'0';
return result.s;
}
string operator % (string x,string y){
bignum result;
memset(result.num,0,sizeof(result.num));
int l=0;
while(y.size()<x.size()) y+="0",l++;
for(int i=0;i<=l;i++){
while(x>y||x==y) x=x-y;
y=y.substr(0,y.size()-1);
}
return x;
}
int operator % (string x,int y){
int k=0;
bignum xx=reverse(x),result;
memset(result.num,0,sizeof(result.num));
result.len=xx.len;
for(int i=xx.len-1;i>=0;i--) result.num[i]=(k*10+xx.num[i])/y,k=(k*10+xx.num[i])%y;
return k;
}
string fast_pow(string x,int y){
string sum="1";
while(y){
if(y%2) sum=sum*x;
sum=sum*sum;
y/=2;
}
return sum;
}
string A(int x,int y){
string sum="1";
for(int i=x;i>x-y;i--) sum=sum*i;
return sum;
}
string fact(int x){
return A(x,x);
}
string C(int x,int y){
y=min(x-y,y);
return A(x,y)/fact(y);
}
int main(){
cin>>n>>m;
cout<<(A(n+2,n+2)*A(m,m)*C(n+3,m))-(A(2,2)*C(n+2,m)*A(m,m)*A(n+1,n+1));
return 0;
}