Description
某理工学校A班全为男生,另有某师范学校B班全为女生。一次,两个班组织了一次联谊活动,观看电影 《美人鱼》,订完票发现所有位置为同一排且从1到T号(T为人的总数),为了让参加活动的每一个女生都有机会同 男生有对话的机会,组织者在安排座位时,让女生左或右,至少有一个男生。现在告诉你男生人数n,女生 人数m,问一共有多少种不同的座位安排方法。
输入格式
每一行一个数W(W<=100),为case数量 此后W行,每行两个数n和m
输出格式
每个case输出一个结果(使用long long)
输入样例
7 3 0 3 1 0 1 1 1 2 2 2 3 2 4
输出样例
6 24 0 2 16 36 48
提示
注意:男生旁边可以没有女生 #include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <string.h> #include <algorithm> #include <queue> #include <stack> #include <vector> using namespace std; // 用递归的方法去排列 排 第 n位的时候 只需要考虑前面两个 p(n-2)位 和 pp(n-1)位 //当前位置 的男女 只要让pp位 符合要求即可;故需要看 pp 和p 来判断当前可放男或女生 long long get_times(int M,int W,int cur,bool p,bool pp,int n) { if(cur==n) { if(W==1&&pp==1) return 0;else return 1; } //对于最后一个人排序 如果最后一个为女生 要考虑 自身不一定符合题意 long long times=0; if(pp==0||pp==1&&p==0) //pp 为男 或者 pp位女且p为男时 { if(M!=0) times+=M*get_times(M-1,W,cur+1,pp,0,n); //当还有剩余男生时 可以放一个男生 if(W!=0) times+=W*get_times(M,W-1,cur+1,pp,1,n); //当还有剩余女生时 可以放一个女生 } if(pp==1&&p==1) if(M!=0) times+=M*get_times(M-1,W,cur+1,0,0,n); //当 pp 和p都为女生时 当前只可以放 男生 来使pp 有效 return times; } long long solve(int M,int W,int n) { if(M==0||n==1&&W==1) return 0; //没有男生 和 只有一个女生 if(M==1&&n==1) return 1; //只有一个男生 long long times=0; times+=M*get_times(M-1,W,2,0,0,n) ; // 第一个是男生时 排列剩余人 if(W>0) times+=W*get_times(M,W-1,2,1,1,n) ;//第一个是女生时 排列剩余人 return times; } int main() { int n_case; cin>>n_case; //n case 事件 int M,W; for(int i=0;i<n_case;i++) { cin>>M>>W; //M 男生 W 女生 cout<<solve( M, W, M+W)<<endl; //输出 符合题意 的个数 } }