[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; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |