QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#167001 | #4283. Power of XOR | jeffqi | WA | 1ms | 3792kb | C++14 | 2.9kb | 2023-09-06 22:28:45 | 2023-09-06 22:28:46 |
Judging History
answer
#include<bits/stdc++.h>
#define ll long long
#define vi vector<int>
#define vll vector<ll>
#define eb emplace_back
#define pb push_back
#define all(v) v.begin(),v.end()
#define rall(v) v.rbegin(),v.rend()
#define sz(v) ((int)v.size())
#define pii pair<int,int>
#define pll pair<ll,ll>
#define fi first
#define se second
#define umap unordered_map
#define uset unordered_set
#define mset multiset
#define ull unsigned ll
#define i128 __int128
using namespace std;
namespace qiqi {
const int P = 1e9+7;
ll pow(ll b,ll k) {
ll a = 1;
for (; k; b = b*b%P,k >>= 1) {
if (k&1) {
a = a*b%P;
}
}
return a;
}
struct LB {
int n,r; vll a;
LB(int n):n(n),r(),a(n) {}
void ins(ll x) {
while (x) {
int p = __lg(x);
if (a[p] == 0) {
r++; a[p] = x;
for (int i = n-1; i > p; i--) {
if ((a[i]>>i)&1) {
a[i] ^= x;
}
}
return;
}
x ^= a[p];
}
}
LB oc() {
LB res(n);
for (int i = n-1; i >= 0; i--) {
if (!a[i]) {
ll x = 1ll<<i;
for (int j = n-1; j > i; j--) {
if ((a[j]>>i)&1) {
x ^= 1ll<<j;
}
}
res.ins(i);
}
}
return res;
}
vll getall() {
vll vec;
for (int i = 0; i < n; i++) {
if (a[i]) {
vec.eb(a[i]);
}
}
const int m = sz(vec);
vll res(1<<m);
for (int i = 1; i < (1<<m); i++) {
int p = __lg(i);
res[i] = res[i^(1<<p)]^vec[p];
}
return res;
}
};
void main() {
int n,m;
cin >> n >> m;
vll a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
const ll mx = *max_element(all(a));
if (mx == 0) {
cout << 0 << '\n';
return;
}
const ll lg = __lg(mx),num = lg+1;
LB lb(num);
for (int i = 0; i < n; i++) {
lb.ins(a[i]);
}
vll p(num+1);
if (lb.r*2 < num) {
vll vec = lb.getall();
for (auto x:vec) {
p[__builtin_popcount(x)]++;
}
}
else {
auto rlb = lb.oc();
vll c(num+1),vec = rlb.getall();
for (auto x:vec) {
c[__builtin_popcount(x)]++;
}
for (int i = 0; i <= num; i++) {
vll f(num+1); f[0] = 1;
c[i] = c[i]*pow(2,P-1-rlb.r)%P;
for (int j = 1; j <= i; j++) {
for (int k = num; k > 0; k--) {
f[k] = (f[k]-f[k-1])%P;
}
}
for (int j = 1; j <= num-i; j++) {
for (int k = num; k > 0; k--) {
f[k] = (f[k]+f[k-1])%P;
}
}
for (int j = 0; j <= num; j++) {
p[j] = (p[j]+c[i]*f[j])%P;
}
}
}
ll ans = 0;
for (int i = 0; i <= num; i++) {
ans = (ans+p[i]*pow(i,m))%P;
}
cout << ans*pow(2,n-lb.r)%P << '\n';
}
}
int main() {
// clock_t st = clock();
// freopen("test.in","r",stdin);
// freopen("test.out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T = 1;
// cin >> T;
while (T--) {
qiqi::main();
}
// cout << (double)(clock()-st)/CLOCKS_PER_SEC << '\n';
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 1ms
memory: 3792kb
input:
3 2 1 2 3
output:
12
result:
ok 1 number(s): "12"
Test #2:
score: 0
Accepted
time: 1ms
memory: 3496kb
input:
2 1000000000 1 2
output:
140625003
result:
ok 1 number(s): "140625003"
Test #3:
score: -100
Wrong Answer
time: 1ms
memory: 3576kb
input:
3 4 21 31 15
output:
-999999327
result:
wrong answer 1st numbers differ - expected: '1076', found: '-999999327'