zoukankan      html  css  js  c++  java
  • D. Jzzhu and Numbers

    这就是这个题目的意思,真的感觉这个思想是太神奇了,我这种菜逼现在绝壁想不到这样的证明的过程的,还有就是这个题的推道过程,以下思路纯属借鉴卿学姐的,还是自己太菜了,,,,

    讲道理这种问题我真的想不到用容斥原理来做啊,那现在我就用容斥原理来讲一下这个问题,,,

    |!A1∩!A2∩!A3∩....!An|=sum-奇数的组合+偶数的组合。。。。

    !A1代表的就第一个位置为0的方案,同理其他的以此类推。。。

    我们知道要是一个数x&i=i; 那么x和i有可能的关系就是x>=i  就是i有一的位置x的位置是肯定有1的。。

    经过我今天早上的疯狂的找原题,今天终于在codeforce找到了原题,要是一共有20位的话,总共的所有的情况就是2^20-1 ,这个子的话我们只要算出来

    aj&i=i有多少种数据就行了,这样子的话我们再统计i中的1的个数,这样子的话我们就能用dp来做这个问题了,我们用dp[i][k]代表前i位有可能和k不同的&k=k的数量,所以当第i为为0的时候那么 dp[i][k]+=dp[i-1][k]+dp[i-1][k+2^i];

    那么当第i位为1的时候,dp[i][k]+=dp[i-1][k],那么就是代表第i为必定相同,然后再根据容斥原理的定义这个题到此已经完成。。。

    泣不成声啊!  妈的竟然过了。

    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    const ll mod=1000000007;
    const int N=1e6+5;
    ll dp[22][1000003];
    ll g[N];
    int a[N];
    int s[N];
    void inist(int n)
    {
        g[0]=1;
        for(int i=1;i<=n;i++)
        {
            g[i]=2*g[i-1];
            g[i]%=mod;
            dp[0][a[i]]++;
        }
    }
    void work(int k,int n)
    {
        // 一共k-1位
        for(int i=1;i<k;i++)
        {
            for(int j=1;j<=1000000;j++)
            {
                if(j&(1<<(i-1)))
                {
                    dp[i][j]=dp[i-1][j];
                    s[j]^=1;
                }
                else
                {
                    dp[i][j]=dp[i-1][j];
                    if((j|(1<<(i-1)))>1e6) continue;
                    dp[i][j]+=dp[i-1][j|(1<<(i-1))];
                }
            }
    
        }
        int num=k-1;
        ll ans=(g[n]-1+mod)%mod;
        for(int i=1;i<=1000001;i++)
        {
            if(s[i]==0) {ans=(ans+g[dp[20][i]]%mod)%mod; ans=(ans-1+mod)%mod;}
            else {ans=(ans-g[dp[20][i]]%mod)%mod; ans=(ans+1+mod)%mod;}
        }cout<<ans<<endl;
    }
    int main()
    {
        int n;
        cin>>n;
        for(int i=1;i<=n;i++) scanf("%d",&a[i]);
        inist(n);
        work(21,n);
    }
    
  • 相关阅读:
    0 Explore TreeView
    按钮颜色选择器
    颜色组合框
    Get Files from Directory
    05.0 图片
    WINAPI 变量(2861个)
    为字符串增加50个空格
    让DataGridView显示行号
    相对路径
    SpecialFolder
  • 原文地址:https://www.cnblogs.com/Heilce/p/6407960.html
Copyright © 2011-2022 走看看