做题状态很迷啊。
题面
https://www.luogu.org/problem/P3223
题解
本来想的是$$ans=A_{n}^{n} A_{n+1}^{m} A_{n+m+1}^{2}$$,先男生、后女生、最后老师,后来发现假了,因为可以两个女生一开始相邻,但是后来老师插进去把他们分离了。
换一种考虑顺序:先男生、后老师、最后女生,分两种情况讨论:
- 老师和老师间有男生(按上面的方法算即可)
- 老师和老师间只有一个女生(先把两个老师看做一个点,考虑女生时再把两个老师和插进去的女生看做一个点,再按上面方法算即可)
$$ans=A_{n}^{n} A_{n+1}^{2} A_{n+3}^{m} + 2 A_{n}^{n} A_{n+1}^{1} A_{m}^{1} A_{n+2}^{m-1}$$
#include<stack> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define LL long long #define N 12000 #define ri register int using namespace std; int a[N+1],b[N+1]; void mul(int x) { for (ri i=0;i<N;i++) a[i]*=x; for (ri i=0;i<N;i++) a[i+1]+=a[i]/10,a[i]%=10; } void mul2(int x) { for (ri i=0;i<N;i++) b[i]*=x; for (ri i=0;i<N;i++) b[i+1]+=b[i]/10,b[i]%=10; } int main() { int n,m; scanf("%d %d",&n,&m); if (m>n+3 || 2>n+m+1) { printf("0"); return 0; } a[0]=1; for (ri i=1;i<=n;i++) mul(i); for (ri i=n+1;i>=n;i--) mul(i); for (ri i=n+3;i>=(n+3)-m+1;i--) mul(i); b[0]=1; for (ri i=1;i<=n;i++) mul2(i); mul2(n+1); mul2(2); mul2(m); for (ri i=n+2;i>=(n+2)-(m-1)+1;i--) mul2(i); for (ri i=0;i<N;i++) a[i]+=b[i],a[i+1]+=a[i]/10,a[i]%=10; int fl=0; for (ri i=N-1;i>=0;i--) { if (a[i]) fl=1; if (fl) printf("%d",a[i]); } return 0; }