標籤:
/*數學題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 longusing namespace std;int n,m,a[1000010],b[1000010],c[1000010],ans[10000010],l1,l2,l;void get_na(){ for(int i=2;i<=n;i++) { for(int j=1;j<=l1;j++) a[j]=a[j]*i; for(int j=1;j<=l1;j++) if(a[j]>=10) { a[j+1]+=a[j]/10; a[j]=a[j]%10; } while(a[l1+1]) { l1++; a[l1+1]+=a[l1]/10; a[l1]=a[l1]%10; } }}void get_nb(){ for(int i=1;i<=l1;i++) b[i]=a[i]; l2=l1;}void Mul1(int x){ for(int i=1;i<=l1;i++) a[i]=a[i]*x; for(int i=1;i<=l1;i++) if(a[i]>=10) { a[i+1]+=a[i]/10; a[i]=a[i]%10; } while(a[l1+1]) { l1++; a[l1+1]+=a[l1]/10; a[l1]=a[l1]%10; }}void Mul2(int x){ for(int i=1;i<=l2;i++) b[i]=b[i]*x; for(int i=1;i<=l2;i++) if(b[i]>=10) { b[i+1]+=b[i]/10; b[i]=b[i]%10; } while(b[l2+1]) { l2++; b[l2+1]+=b[l2]/10; b[l2]=b[l2]%10; }}void Add(){ l=max(l1,l2); for(int i=1;i<=l;i++) c[i]=a[i]+b[i]; for(int i=1;i<=l;i++) if(c[i]>9) { c[i+1]++;c[i]=c[i]%10; } while(c[l+1])l++;}int main(){ scanf("%d%d",&n,&m); a[1]=1;l1=1; b[1]=1;l2=1; get_na(); get_nb(); Mul1(n); Mul1(n+1); for(int i=n+3;i>=n+3-m+1;i--) Mul1(i); Mul2(2*m); Mul2(n+1); for(int i=n+2;i>=n+2-m+1+1;i--) Mul2(i); Add(); for(int i=l;i>=1;i--) printf("%d",c[i]); return 0;}
codevs 1994 排隊 排列組合+高精度