生活随笔
收集整理的这篇文章主要介绍了
牛客练习赛76 E 牛牛数数(线性基加二分)
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
牛客地址
思路:全部组合异或,很容易想到使用线性基,正好线性基中有一个求第k小的用法,那我们可以二分来找 K是第几小的数,然后用总数减去。
#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#include <cstdlib>
#define INF 0x3f3f3f3f3f3f3f3f
#define inf 0x3f3f3f3f
#define FILL(a,b) (memset(a,b,sizeof(a)))
#define re register
#define lson rt<<1
#define rson rt<<1|1
#define lowbit(a) ((a)&-(a))
#define ios std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);
#define fi first
#define rep(i,n) for(int i=0;(i)<(n);i++)
#define rep1(i,n) for(int i=1;(i)<=(n);i++)
#define se second
#define scd(a) scanf("%d",&a)
#define scdd(a,b) scanf("%d%d",&a,&b)
#define scddd(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define ac cout<<ans<<"\n"
using namespace std
;
typedef long long ll
;
typedef unsigned long long ull
;
typedef pair
<ll
,ll
> pii
;
int dx
[4]= {-1,1,0,0},dy
[4]= {0,0,1,-1};
const ll mod
=1e9+7;
const ll N
=1e6+10;
const double eps
= 1e-4;
ll
gcd(ll a
,ll b
){return !b
?a
:gcd(b
,a
%b
);}
ll n
,k
,x
,tot
;
ll d
[70];
int cnt
;
void ins(ll x
){for(int i
=60;i
>=0;i
--){if(x
&(1ll<<i
)){if(d
[i
]) x
^=d
[i
];else{d
[i
]=x
;return;}}}tot
=1;
}
void rebuild()
{for(int i
=1;i
<=60;i
++)for(int j
=1;j
<=i
;j
++)if(d
[i
]&(1ll<<(j
-1)))d
[i
]^=d
[j
-1];for(int i
=0;i
<=60;i
++) if(d
[i
]) cnt
++;
}
ll
check(ll x
){if(!x
) return 0;if(x
>=(1ll<<cnt
)) return INF
;ll ans
=0;for(int i
=0;i
<=60;i
++){if(d
[i
]){if(x
&1) ans
^=d
[i
];x
/=2;}}return ans
;
}
void sovle(){cin
>>n
>>k
;for(int i
=1;i
<=n
;i
++){cin
>>x
;ins(x
);}rebuild();ll s
=(1ll<<cnt
)-1;ll l
=0,r
=s
;while(l
<r
){ll mid
=(l
+r
+1)>>1;if(check(mid
)<=k
) l
=mid
;else r
=mid
-1;}cout
<<s
-l
<<endl
;
}
int main()
{ios
int t
=1;while(t
--){sovle();}return 0;
}
总结
以上是生活随笔为你收集整理的牛客练习赛76 E 牛牛数数(线性基加二分)的全部内容,希望文章能够帮你解决所遇到的问题。
如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。