Description
某中学有 n 名男同学,m 名女同学和两名老师要排队参加体检。他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不同的)
Input
只有一行且为用空格隔开的两个非负整数 n 和 m,其含义如上所述。
对于 30%的数据 n≤100,m≤100
对于 100%的数据 n≤2000,m≤2000
Output
输出文件 output.txt 仅包含一个非负整数,表示不同的排法个数。注意答案可能很大。
Sample Input
1 1
Sample Output
12
Solution
一种情况是两个老师中间只有一个人且这个人是女生。
即$A(n,n)*A(n+1,1)*A(2,2)*A(m,1)*A(n+2,m-1)$
另一种情况是两个老师中间不是只有一个女生,也就是两个老师中间一定有男生。
即$A(n,n)*A(n+1,2)*A(n+3,m)$
Code
1 #include2 #include 3 #include 4 #include 5 #include 6 #define MAX_L 20005 7 using namespace std; 8 9 class bign 10 { 11 public: 12 int len, s[MAX_L]; 13 bign(); 14 bign(const char*); 15 bign(int); 16 bool sign; 17 string toStr() const; 18 friend istream& operator>>(istream &,bign &); 19 friend ostream& operator<<(ostream &,bign &); 20 bign operator=(const char*); 21 bign operator=(int); 22 bign operator=(const string); 23 bool operator>(const bign &) const; 24 bool operator>=(const bign &) const; 25 bool operator<(const bign &) const; 26 bool operator<=(const bign &) const; 27 bool operator==(const bign &) const; 28 bool operator!=(const bign &) const; 29 bign operator+(const bign &) const; 30 bign operator++(); 31 bign operator++(int); 32 bign operator+=(const bign&); 33 bign operator-(const bign &) const; 34 bign operator--(); 35 bign operator--(int); 36 bign operator-=(const bign&); 37 bign operator*(const bign &)const; 38 bign operator*(const int num)const; 39 bign operator*=(const bign&); 40 bign operator/(const bign&)const; 41 bign operator/=(const bign&); 42 bign operator%(const bign&)const; 43 bign factorial()const; 44 bign Sqrt()const; 45 bign pow(const bign&)const; 46 void clean(); 47 ~bign(); 48 }; 49 50 bign::bign() 51 { 52 memset(s,0,sizeof(s)); 53 len=1; 54 sign=1; 55 } 56 57 bign::bign(const char *num) 58 { 59 *this=num; 60 } 61 62 bign::bign(int num) 63 { 64 *this=num; 65 } 66 67 string bign::toStr() const 68 { 69 string res; 70 res=""; 71 for (int i=0; i >(istream &in, bign &num) 81 { 82 string str; 83 in>>str; 84 num=str; 85 return in; 86 } 87 88 ostream &operator<<(ostream &out, bign &num) 89 { 90 out< =0; i--)133 if (s[i]!=num.s[i])134 return sign?(s[i] (const bign&num)const139 {140 return num<*this;141 }142 143 bool bign::operator<=(const bign&num)const144 {145 return !(*this>num);146 }147 148 bool bign::operator>=(const bign&num)const149 {150 return !(*this num || *this = 0) g=0;236 else237 {238 g=1;239 x += 10;240 }241 result.s[result.len++]=x;242 }243 result.clean();244 return result;245 }246 247 bign bign::operator * (const bign &num)const248 {249 bign result;250 result.len=len+num.len;251 252 for (int i=0; i = 0)293 {294 while (divisor.s[j]==0) j--;295 if (k > j) k=j;296 char z[MAX_L];297 memset(z, 0, sizeof(z));298 for (int i=j; i >= k; i--)299 z[j-i]=divisor.s[i]+'0';300 bign dividend=z;301 if (dividend 1 && s[len-1]=='\0')357 len--;358 }359 360 bign bign::Sqrt()const361 {362 if(*this<0)return -1;363 if(*this<=1)return *this;364 bign l=0,r=*this,mid;365 while(r-l>1)366 {367 mid=(l+r)/2;368 if(mid*mid>*this) r=mid;369 else l=mid;370 }371 return l;372 }373 374 bign::~bign()375 {376 }377 378 bign A(int n,int m)379 {380 bign ans;381 ans=1;382 for (int i=n-m+1; i<=n; ++i) ans*=i;383 return ans;384 }385 386 int n,m; 387 388 int main()389 {390 scanf("%d%d",&n,&m);391 bign ans=A(n,n)*A(n+1,2)*A(n+3,m)+A(n,n)*A(n+1,1)*A(2,2)*A(m,1)*A(n+2,m-1);392 cout<