【暴力+剪枝】 2017ICPC 西安 J LOL

 

UVALive - 8521

5个人,一共有100个英雄,0代表他没有,1代表他有

敌方什么英雄都有

我方和敌方都可以选择五个英雄BAN和PICK,也就是20个英雄不一样

解题方法:枚举出我方前四个人的选择英雄的情况,先预存第五个人的英雄数量,前四个人选的英雄要是我也有,就数量--,

那么我还有几个就是有多少种情况

我方五个人选的英雄的每一种情况都可以*A(95,5)*C(90,5)*C(85,5)

A(95,5):敌方选择的英雄种类,重点在于顺序可以不一样,

C(90,5):我方BAN掉的英雄种类

C(85,5):敌方BAN掉的英雄种类

#include 
#define ll long long
using namespace std;
const int mod=1e9+7;
char a[105],b[105],c[105],d[105],e[105];
ll A(ll n, ll r)//排列数
{    ll sum = 1;
     for (int i = 0; i < r; i++)
       sum *= n-i;
 return sum;
}
ll C(ll n, ll r)//组合数
{    ll sum = 1;
     for (int i = 1; i <= r; i++)
      sum = sum * (n+1-i)/i;
   return sum;
}

int main()
{
    while(~scanf("%s%s%s%s%s",a,b,c,d,e))
    {
        int l1=0,l2=0,l3=0,l4=0,l5=0;
        for(int i=0;i<100;i++)
        {
            if(a[i]=='1') l1++;
            if(b[i]=='1') l2++;
            if(c[i]=='1') l3++;
            if(d[i]=='1') l4++;
            if(e[i]=='1') l5++;
        }
        ll ans=0;
        for(int i=0;i<100;i++)
        {
            if(a[i]=='0') continue;
            for(int j=0;j<100;j++)
            {
                if(b[j]=='0'||i==j) continue;
                for(int k=0;k<100;k++)
                {
                    if(c[k]=='0'||k==i||k==j) continue;
                    for(int p=0;p<100;p++)
                    {
                        int q=l5;
                        if(d[p]=='0'||p==i||p==j||p==k) continue;
                        if(e[i]=='1') q--;
                        if(e[j]=='1') q--;
                        if(e[k]=='1') q--;
                        if(e[p]=='1') q--;
                        if(q>=0) ans+=q;
                    }
                }
            }
        }
        ans=ans*A(95,5)%mod*C(90,5)%mod*C(85,5)%mod;
        printf("%lld\n",ans);
    }
    return 0;
}
/*
0110011100011001001100011110001110001110001010010111111110101010010011010000110100011001001111101011
1000111101111110110100001101001101010001111001001011110001111110101000011101000001011100001001011010
0100101100011110011100110110011100111100010010011001111110101111111000000110001110000110001100001110
1110010101010001000110100011101010001010000110001111111110101010000000001111001110110101110000010011
1000010011111110001101100000101001110100011000111010011111110110111010011111010110101111011111011011

515649254
*/

 

你可能感兴趣的:(暴力大法好,剪枝)