[Luogu3773] [LOJ2264] [UOJ300]
\(x!的2因子数f(x)=\sum_{i=1}^{ \infty} \frac{x}{2^i}\)
我们设\(g(x)=x,\)那么\(g(x)=g(\frac{x}{2})+\frac{x}{2}+(x\bmod 2)=\sum_{i=1}^{ \infty} \frac{x}{2^i}\)
那么$C_n^k $是奇数的条件即为:n在二进制下1的个数=k在二进制下1的个数+(n-k)在二进制下1的个数
综上, \(C_n^k\)是奇数的条件为: (n&k)=k
枚举方法见代码,比较巧妙
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define Debug(x) cout<<#x<<"="<<x<<endl
using namespace std;
typedef long long LL;
const int INF=1e9+7;
inline LL read(){
register LL x=0,f=1;register char c=getchar();
while(c<48||c>57){if(c=='-')f=-1;c=getchar();}
while(c>=48&&c<=57)x=(x<<3)+(x<<1)+(c&15),c=getchar();
return f*x;
}
const int MAXN=222005;
const int MAXM=233335;
const int mod=1e9+7;
int a[MAXN],pos[MAXM],f[MAXN];
int n,ans;
int main(){
n=read();
for(int i=1;i<=n;i++){
a[i]=read();
pos[a[i]]=i;
}
for(int i=n;i>=1;i--){
f[i]=1;
for(int j=a[i];j;j=a[i]&(j-1))//枚举很巧妙
if(pos[j]>i) (f[i]+=f[pos[j]])%=mod;
(ans+=f[i])%=mod;
}
ans=(ans-n+mod)%mod;
printf("%d\n",ans);
}