Uva11538 排列组合水题

时间:2022-12-30 16:04:24

画个图就很容易推出公式:

设mn=min(m,n),mx=max(m,n)

对角线上:Uva11538      排列组合水题

横向:m*C(n,2)

纵向:n*C(m,2)

因为所有的C函数都是只拿了两个,所以可以优化下。不过不优化也过了= =

 #include <iostream>
using namespace std;
#define LL long long
int n,m; LL P(long n,long m)
{
long p=;
while(m!=)
{
p*=n;
n--;
m--;
}
return p;
} LL C(long n,long m)
{
long i,c=;
i=m;
while(i!=)
{
c*=n;
n--;
i--;
}
while(m!=)
{
c/=m;
m--;
}
return c;
} int main()
{
while (cin>>n>>m)
{
if ((n==)&&(m==)) break;
int mn=min(n,m),mx=max(n,m);
LL sum=;
for (int i=;i<=mn;i++)
sum+=C(i,);
if (mx>) sum=sum*;
if (mx-mn->) sum+=(mx-mn-)*C(mn,);
sum=sum*; sum+=m*C(n,)+n*C(m,); sum=sum*;
cout<<sum<<endl;
}
return ;
}