lucas DP
这道题翰爷很早以前讲过,然而当时我连lucas都不会,今天又讲到这题才听懂。
要使那个式子模 ,则每一项都必须为 。由lucas定理得最终只有四种情况: 。可以发现只有 这一个为0, 其实是每一位分别计算后的乘积。那么要使式子不为0,就说明 是 的子集,即 。
设 表示以 结尾的满足条件的不上升子序列个数。那么我们每读入一个 就去找子集为 的数累加即可。
代码:
#include<cctype>
#include<cstdio>
#define F inline
#define N 233333
using namespace std;
const int p=1e9+7;
int n,ans,f[N+5];
F char readc(){
static char buf[100000],*l=buf,*r=buf;
if (l==r) r=(l=buf)+fread(buf,1,100000,stdin);
return l==r?EOF:*l++;
}
F int _read(){
int x=0; char ch=readc();
while (!isdigit(ch)) ch=readc();
while (isdigit(ch)) x=(x<<3)+(x<<1)+(ch^48),ch=readc();
return x;
}
int main(){
for (n=_read();n;n--){
int x=_read();
for (int i=x;i<=N;i=i+1|x)
f[x]=(f[x]+f[i])%p;
ans=(ans+(f[x]++))%p;
}
return printf("%d\n",ans),0;
}