滴滴的小球问题,排列组合
滴滴 小球排列
弄了一晚上,终于弄好了
#include<iostream>
using namespace std;int main(){
long long res=0;
long long p,q,r;
cin>>p>>q>>r;
if(p>q)swap(p,q);
if(p>r)swap(p,r);
if(q>r)swap(q,r);
if(r>(q+p+1)){
cout<<0<<endl;
return 0;
}
long long a[p+1][q+1][r+1];
for(long long i=1;i<=p;i++){
for(long long j=1;j<=q;j++){
for(long long k=1;k<=r;k++){
a[i][j][k]=0;
}
}
}
for(long long i=1;i<=p;i++){
for(long long j=i;j<=q;j++){
for(long long k=j;k<=r;k++){
if(i==1&&j==1&&k==1){
a[i][j][k]=6;
//cout<<i<<"-"<<j<<"-"<<k<<":"<<a[i][j][k]<<endl;
continue;
}
if(i==j&&j==k){
a[i][j][k]=a[i-1][j][k]*(k+j+2-i);
if(j>1){a[i][j][k]+=a[i-1][j-1][k]*(j-1)*2;}
a[i][j][k]=a[i][j][k]/i;
//cout<<i<<"-"<<j<<"-"<<k<<":"<<a[i][j][k]<<endl;
continue;
}
if(j==k){
a[i][j][k]=a[i][j-1][k]*(k+i+2-j);
if(i>1){a[i][j][k]+=a[i-1][j-1][k]*(i-1);}
if(k>1){a[i][j][k]+=a[i][j-1][k-1]*(k-1);}
a[i][j][k]=a[i][j][k]/j;
//cout<<i<<"-"<<j<<"-"<<k<<":"<<a[i][j][k]<<endl;
continue;
}
if(k>(j+i+1)){
break;
}
a[i][j][k]=a[i][j][k-1]*(i+j+2-k);
if(i>1){a[i][j][k]+=a[i-1][j][k-1]*(i-1);}
if(j>1&&j>i){a[i][j][k]+=a[i][j-1][k-1]*(j-1);}
else if(j>1&&j==i){a[i][j][k]+=a[i-1][j][k-1]*(i-1);}
//int ys=a[i][j][k]%(k);
a[i][j][k]=a[i][j][k]/k;
// cout<<i<<"-"<<j<<"-"<<k<<":"<<a[i][j][k]<<"---ys:"<<ys<<endl;
}
}
}
cout<<a[p][q][r]<<endl;
return 0;
}