QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#167001#4283. Power of XORjeffqiWA 1ms3792kbC++142.9kb2023-09-06 22:28:452023-09-06 22:28:46

Judging History

你现在查看的是最新测评结果

  • [2023-09-06 22:28:46]
  • 评测
  • 测评结果:WA
  • 用时:1ms
  • 内存:3792kb
  • [2023-09-06 22:28:45]
  • 提交

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'