Alien Flowers

题意:

求含有A个"RR",B个"RB",C个"BB",D个"BR"的字符串个数。

 

解法:

首先考虑"BR"与"RB",我们可以首先"B","R"相间来排列进而满足B,D的限制。

这样,我们只需要考虑将"BB"和"RR"塞入初始得到的串即可,考虑隔板法。

PS:这题数据"0 0 0 0"有毒。

 

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 
 5 #define LL long long
 6 #define P 1000000007LL
 7 #define N 100010
 8 
 9 using namespace std;
10 
11 int a,b,c,d;
12 LL fac[N*2];
13 
14 LL qpow(LL x,int n)
15 {
16     LL ans=1;
17     for(;n;n>>=1,x=x*x%P)
18         if(n&1) ans=ans*x%P;
19     return ans;
20 }
21 
22 LL C(int n,int m)
23 {
24     if(m==0) return 1LL;
25     return fac[n]*qpow(fac[n-m],P-2)%P*qpow(fac[m],P-2)%P;
26 } 
27 
28 int main()
29 {
30     fac[0]=1;
31     for(int i=1;i<2*N;i++) fac[i] = fac[i-1]*(LL)i%P;
32     while(~scanf("%d%d%d%d",&a,&b,&c,&d))
33     {
34         if(b==0 && d==0)
35         {
36             if(a!=0 && c!=0) puts("0");
37             else if(a!=0 || c!=0) puts("1");
38             else puts("2");
39             continue;
40         }
41         LL ans;
42         if(b==d)
43         {
44             ans = C(c+b-1,b-1)*C(a+b,b)%P;
45             ans += C(c+b,b)*C(a+b-1,b-1)%P;
46             if(ans>=P) ans-=P;
47             cout << ans << endl;
48         }
49         else if(b==d+1 || d==b+1)
50         {
51             b = max(b,d); 
52             ans = C(b+c-1,b-1)*C(b+a-1,b-1)%P;
53             cout << ans << endl;
54         }
55         else puts("0");
56     }
57     return 0;
58 }
View Code

 

posted @ 2017-03-13 17:06  lawyer'  阅读(112)  评论(0编辑  收藏  举报