题目
Description
小J养了 N 只狗和 M 只猴.小J想把这 N+M 只动物排成一列,希望狗与狗不互相挨着,猴与猴不互相挨着.这样的排列方式有多少种?不过狗与狗间,猴与猴间相互区别.
Format
Input
1行包含两个整数N,M(1≤N,M≤105)
Output
输出方案数对 109+7取模的结果
Samples
输入数据 1
2 2
输出数据 1
8
Hint
将每只狗分别记为A,B,将每只猴分别记为C,D,则共有ACBD,ADBC,BCAD,BDAC,CADB,CBDA,DACB,DBCA这8种排列方法.
思路
把每只狗都记为0,每只猴都记为1,则有以下几种情况:
- 1010…1010或0101…0101
- 1010…10101
- 0101…01010
- 不可排列
1~3中每一种动物都有自己独立的排列顺序.
所以,
先求出狗排列的方式的个数,
再求出猴排列的方式的个数,
最后将它们相乘,
就得出答案了.
(最后不要忘记取模哦!)
CODE
#include<bits/stdc++.h>
using namespace std;
const long long X=1000000007;
long long m,n,o,ans;
long long jc(int x){
long long sum=1;
for(int i=1;i<=x;i++)
sum=sum*i%X;//有可能会数据溢出,每一次都应该对10^9+7取模
return sum;
}
int main(){
scanf("%lld%lld",&m,&n);
o=abs(m-n);
if(o==1)
ans=jc(m)*jc(n)%X;
if(o==0)
ans=2*jc(m)*jc(n)%X;
printf("%lld",ans);
return 0;
}