codevs 1994 排队 排列组合+高精度

/*
数学题0.0
最后答案:A(n,n)*A(n+1,2)*A(n+3,m)+A(n,n)*C(m,1)*A(2,2)*C(n+1,1)*A(n+2,m-1);
简单解释一下
+之前的很显然 先排男生 然后老师插空 然后女生插空 显然符合条件
但仔细一想会发现少算了一部分 就是 老师 女生 老师 的情况
在单独考虑着一种 先选夹在中间的女生(C(m,1)) 然后老师换位置 A(2,2)
然后安排这个(C(n+1,1)) 然后剩下的女生插空
注意不能把 老师 女生 老师 和其他女生看成一样的 因为这个具有特殊性
然后就是高精了 最简单的 连压位都不用
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
int n,m,a[],b[],c[],ans[],l1,l2,l;
void get_na()
{
for(int i=;i<=n;i++)
{
for(int j=;j<=l1;j++)
a[j]=a[j]*i;
for(int j=;j<=l1;j++)
if(a[j]>=)
{
a[j+]+=a[j]/;
a[j]=a[j]%;
}
while(a[l1+])
{
l1++;
a[l1+]+=a[l1]/;
a[l1]=a[l1]%;
}
}
}
void get_nb()
{
for(int i=;i<=l1;i++)
b[i]=a[i];
l2=l1;
}
void Mul1(int x)
{
for(int i=;i<=l1;i++)
a[i]=a[i]*x;
for(int i=;i<=l1;i++)
if(a[i]>=)
{
a[i+]+=a[i]/;
a[i]=a[i]%;
}
while(a[l1+])
{
l1++;
a[l1+]+=a[l1]/;
a[l1]=a[l1]%;
}
}
void Mul2(int x)
{
for(int i=;i<=l2;i++)
b[i]=b[i]*x;
for(int i=;i<=l2;i++)
if(b[i]>=)
{
b[i+]+=b[i]/;
b[i]=b[i]%;
}
while(b[l2+])
{
l2++;
b[l2+]+=b[l2]/;
b[l2]=b[l2]%;
}
}
void Add()
{
l=max(l1,l2);
for(int i=;i<=l;i++)
c[i]=a[i]+b[i];
for(int i=;i<=l;i++)
if(c[i]>)
{
c[i+]++;c[i]=c[i]%;
}
while(c[l+])l++;
}
int main()
{
scanf("%d%d",&n,&m);
a[]=;l1=;
b[]=;l2=;
get_na();
get_nb();
Mul1(n);
Mul1(n+);
for(int i=n+;i>=n+-m+;i--)
Mul1(i);
Mul2(*m);
Mul2(n+);
for(int i=n+;i>=n+-m++;i--)
Mul2(i);
Add();
for(int i=l;i>=;i--)
printf("%d",c[i]);
return ;
}
上一篇:获取当前html标签自定义属性的值


下一篇:PHP asin() 函数