DP的转移是一个子集和的形式
直接做是
318
按照高9位 低9位分块可以做到
29×39=69
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
#define read(x) scanf("%d",&(x))
const int N=1<<18;
const int P=1000000007;
int n,a[N];
int f[N];
inline void add(int &x,int y){
x+=y; if (x>=P) x-=P;
}
inline void Add(int x,int y){
int a=x>>9,b=x&511;
for (int i=a;i;i=(--i)&a)
add(f[(i<<9)|b],y);
add(f[b],y);
}
inline int Query(int x){
int a=x>>9,b=(~x)&511; int ret=0;
for (int i=b;i;i=(--i)&b)
add(ret,f[(a<<9)|((~i)&511)]);
add(ret,f[(a<<9)|511]);
return ret;
}
int main(){
freopen("t.in","r",stdin);
freopen("t.out","w",stdout);
read(n); for (int i=1;i<=n;i++) read(a[i]);
int ans=0;
for (int i=1;i<=n;i++){
int t=Query(a[i])+1;
add(ans,t);
Add(a[i],t);
}
printf("%d\n",(ans+P-n)%P);
return 0;
}