[UOJ300][CTSC2017]吉夫特
|
uoj sol根据(Lucas)定理,(binom nm mod 2=binom{n%2}{m%2}timesbinom{n/2}{m/2}mod 2)。 由于(binom{n%2}{m%2})的取值只可能是(0)或(1),以为我们希望(binom nm=1mod 2),所以(binom{n%2}{m%2})应该始终取值为(1)。因为(binom 00=binom 10=binom 11=1,binom 01=0),所以(binom{n%2}{m%2})始终为(1)其实就要求了(n)在每个二进制位上的值都不小于(m)在那位上的值。 code#include<cstdio>
#include<algorithm>
using namespace std;
int gi(){
int x=0,w=1;char ch=getchar();
while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if (ch=='-') w=0,ch=getchar();
while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return w?x:-x;
}
const int mod = 1e9+7;
int n,ans,t[1<<18];
void mdf(int x,int y){
int a=x&(~511),b=x&511;(t[b]+=y)%=mod;
for (int c=a;c;c=(c-1)&a) (t[c|b]+=y)%=mod;
}
int qry(int x){
int a=x&(~511),b=(x&511)^511,res=t[a|511];
for (int c=b;c;c=(c-1)&b) (res+=t[a|(c^511)])%=mod;
return res;
}
int main(){
n=gi();
for (int i=1;i<=n;++i){
int a=gi(),f=qry(a)+1;
ans=(ans+f)%mod;mdf(a,f);
}
printf("%dn",(ans-n+mod)%mod);return 0;
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
