2018 Multi-University Training Contest 9----hdu 6425 Rikka with Badminton

点击链接

题意:

         学生既没有球拍也没有球,b学生只有球拍,c学生只有球,d学生同时有球拍和球。俱乐部将组织学生打羽毛球。每个学生都可以选择自由参加。因此,有2^{n}可能的注册状态。要打羽毛球,必须至少有两名学生有球拍,至少有一名学生有球。因此,如果没有足够的球或球拍,活动将失败。
现在,Rikka想要计算所有2^{n}可能的注册状态中的状态数,这将使活动失败。 求失败的数量

 

这道题可以分解来看,对于a自己本身,假设a是2的话,那么a可以取0(代表没人报名),  1  , 2  ,或者1和2同时报名,所以对于 a=2时就有C_{2}^{0}\textrm{}+C_{2}^{1}\textrm{}+C_{2}^{2}\textrm{}种情况,,也就是2^{n}

现在分情况来取,如果全都不取的话就是

  0+0+0+0

只取一类人的话,对于a,b,c来说,不管取多少个,都无法参加,而对于d来说只要超过两个人就可以参加,所以就是

 (2^{a}-1)+(2^{b}-1)+(2^{c}-1)+C_{d}^{1}\textrm{}

  为什么这里减了一,,因为我们把0的情况在前面取好了

如果同时取两类人,对于a,b和a,c来说,怎么取都无所谓,a,d的话d只能取一人,b,c也是b只能取一人,c,d也是d只能取一人,所以就是

 (2^{a}-1)*(2^{b}-1)+(2^{a}-1)*(2^{c}-1)+(2^{a}-1)*C_{d}^{1}\textrm{}+(2^{c}-1)*C_{b}^{1}\textrm{}+(2^{c}-1)*C_{d}^{1}\textrm{}

如果同时取三类人,对于a,b,c和a,c,d来说,b和d只能取一个,而b,c,d不可取,所以就是

(2^{a}-1)*(2^{c}-1)*C_{b}^{1}\textrm{}+(2^{a}-1)*(2^{c}-1)*C_{d}^{1}\textrm{}

四类人在一起的话也不满足,,所以答案就是以上几种的总和

 

#include

using namespace std;
const long long mod=998244353;
long long quick(long long a,long long times){
     long long ans=1;
     while(times){
         if(times&1){
             ans=ans*a%mod;
         }
         a=a*a%mod;
         times/=2;
     }
     return ans;
}
int main(){
    int n;
    scanf("%d",&n);
        for(int i=1;i<=n;i++){
            long long a,b,c,d;
            scanf("%lld %lld %lld %lld",&a,&b,&c,&d);
            long long ans=0;
            long long powa=quick(2,a)-1;
            long long powb=quick(2,b)-1;
            long long powc=quick(2,c)-1;
            ans=(1+powa+powb+powc+d+(powa*powb)%mod+(powa*powc)%mod+(powa*d)%mod+ (powc*d)%mod+(b*powc)%mod+((powa*powc)%mod*b)%mod+((powa*powc)%mod*d)%mod)%mod;
            printf("%lld\n",ans);
        }
    
        
}
//样例
//2 2 2 2
//1+3+3+3+2+3*3+3*3+3*2+3*2+3*2+3*3*2+3*3*2
//12+9+9+6+6+6+18+18
//84

 

 

 

 

 

 

 

你可能感兴趣的:(多校赛题解)