CTSC2017吉夫特

Posted kgxw0430

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CTSC2017吉夫特相关的知识,希望对你有一定的参考价值。

  CTSC水题!

  做这道题你得了解Lucas定理才行。当模数小的时候,C(n,m)可以转换为Π C(ai,bi),其中ai和bi分别是n和m在mod进制下的每一位。本题mod为2,所以就是二进制下的Π。

  你想让连乘大于0,那么所有的都应该等于1.那么对于任意ai,bi,必须有ai>=bi。即b是a的子集,我们只需要倒序递推,每次枚举当前数的子集,答案累加就可以了。至于复杂度,因为ai<=233333,且每个数是唯一的,所以复杂度可以通过。

#include<bits/stdc++.h>
using namespace std;
const int N=240000;
const int mod=1e9+7;
int f[N],a[N],n,ans,flag[N];
inline int read(){
    char ch=getchar();int num=0,f=1;
    while(!isdigit(ch)){if(ch==-) f=-1;ch=getchar();}
    while(isdigit(ch)){num=(num<<1)+(num<<3)+(ch^48);ch=getchar();}
    return num*f;
}
int main(){
    n=read();
    for(register int i=1;i<=n;++i) a[i]=read();
    for(register int i=n;i>0;--i){
        flag[a[i]]=1;
        for(register int j=(a[i]-1)&a[i];j!=0;j=(j-1)&a[i]){
            if(!f[j]&&flag[j]) f[a[i]]=(f[a[i]]+1)%mod;
            else if(f[j]) f[a[i]]=(f[a[i]]+f[j]+1)%mod;
        }
    }
    for(register int i=1;i<=n;++i) ans=(ans+f[a[i]])%mod;
    printf("%d
",ans);
    return 0;
}

 

以上是关于CTSC2017吉夫特的主要内容,如果未能解决你的问题,请参考以下文章

CTSC2017吉夫特

uoj#300.CTSC2017吉夫特

[luogu 3773][CTSC 2017]吉夫特

bzoj 4903: [Ctsc2017]吉夫特lucas+状压dp

bzoj4903/uoj300[CTSC2017]吉夫特 数论+状压dp

[CTSC2017][bzoj4903] 吉夫特 [状压dp+Lucas定理]