zoukankan      html  css  js  c++  java
  • codeforces 449D DP+容斥

    Jzzhu and Numbers
    Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u
    Submit Status
    Appoint description: 

    Description

    Jzzhu have n non-negative integers a1, a2, ..., an. We will call a sequence of indexes i1, i2, ..., ik(1 ≤ i1 < i2 < ... < ik ≤ n) a group of size k.

    Jzzhu wonders, how many groups exists such that ai1 & ai2 & ... & aik = 0(1 ≤ k ≤ n)? Help him and print this number modulo1000000007(109 + 7). Operation x & y denotes bitwise AND operation of two numbers.

    Input

    The first line contains a single integer n(1 ≤ n ≤ 106). The second line contains n integers a1, a2, ..., an(0 ≤ ai ≤ 106).

    Output

    Output a single integer representing the number of required groups modulo 1000000007(109 + 7).

    Sample Input

    Input
    3
    2 3 3
    Output
    0
    Input
    4
    0 1 2 3
    Output
    10
    Input
    6
    5 2 0 5 2 1
    Output
    53

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 using namespace std;
     5 
     6 typedef __int64 LL;
     7 const LL mod=1000000007;
     8 const int maxn=1<<20;
     9 int dp[20][1<<20];
    10 int a[1<<20];
    11 
    12 LL pow_mod(LL a,LL b)
    13 {
    14     LL ret=1;a%=mod;
    15     while(b)
    16     {
    17         if(b&1) ret=ret*a%mod;
    18         a=a*a%mod;
    19         b>>=1;
    20     }
    21     return ret;
    22 }
    23 
    24 int main()
    25 {
    26     int n,i,j;
    27     int ans,t,tt;
    28     scanf("%d",&n);
    29     for(i=1;i<=n;i++) scanf("%d",&a[i]);
    30     memset(dp,0,sizeof(dp));
    31     for(i=1;i<=n;i++)
    32     {
    33         if(a[i]&1)
    34         {
    35             dp[0][ a[i] ]++;dp[0][ a[i]^1 ]++;
    36         }
    37         else dp[0][ a[i] ]++;
    38     }
    39     for(i=0;i<19;i++)
    40         for(j=0;j<maxn;j++)
    41         {
    42             t=1<<(i+1);
    43             if(j&t)
    44             {
    45                 dp[i+1][j]+=dp[i][j];dp[i+1][ j-t ]+=dp[i][j];
    46             }
    47             else dp[i+1][j]+=dp[i][j];
    48         }
    49     ans=0;
    50     for(j=0;j<maxn;j++)
    51     {
    52         t=1;
    53         for(i=0;i<20;i++)
    54             if((1<<i)&j)
    55                 t=-t;
    56         tt=pow_mod(2,dp[19][j]);
    57         tt--;
    58         ans=((ans+t*tt)%mod+mod)%mod;
    59     }
    60     printf("%d
    ",ans);
    61     return 0;
    62 }
  • 相关阅读:
    HashMap put get 源码解析
    HashMap 源码
    配置spring boot请求的入参和出参json数据格式
    配置idea的注释模板
    基本数据类型
    Linux命令系列之
    Linux命令系列之
    Linux命令系列之
    Linux命令系列之
    Linux命令系列之
  • 原文地址:https://www.cnblogs.com/xiong-/p/3892681.html
Copyright © 2011-2022 走看看