1 条题解
-
0
自动搬运
来自洛谷,原作者为

Kinandra
:D搬运于
2025-08-24 22:04:45,当前版本为作者最后更新于2019-01-30 14:26:21,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
.标签:线性基.
.首先求出的线性基 .
.如果去除序列中重复的数, 使用线性基, 根据的二进制位便可以确定的排名, 可是如果不去重, 怎么才能知道每个数出现多少次呢?
.结论: 每个数都出现一样的次数, 且这个次数为.
证明:所有不在线性基中的数的个数为, 我们任意选择它的一个子集.
, 有唯一的方式表达为中向量的线性组合, 即有唯一子集使得该子集中的向量异或和与异或得.
, 我们都能找到种不同的选择方案, 使得异或值为.
又对于每个子集, 选择线性基中的向量的方案是唯一的.
方案数的上界也是.
有理有据, 令人信服
#include <iostream> #include <cstdio> using namespace std; int read() { int x = 0, f = 1; char c = getchar(); while (c < '0' || c > '9') { if (c == '-') f = -1; c = getchar(); } while (c >= '0' && c <= '9') { x = x * 10 + c - '0'; c = getchar(); } return x * f; } int b[102]; int cnt = 1, mod = 10086; void ist(int tmp) { for (int i = 30; i >= 0; --i) { if (!((1 << i) & tmp)) continue; if (!b[i]) { b[i] = tmp; break; } tmp ^= b[i]; if (tmp == 0) { (cnt <<= 1) %= mod; break; } } } int dp[102][3]; int main() { int n = read(); for (int i = 1; i <= n; ++i) { int tmp = read(); ist(tmp); } int tmp = read(); int rk = 0; int tp = 1; for (int i = 0; i <= 30; ++i) { if (b[i]) { if ((tmp >> i) & 1)rk += tp; tp <<= 1; } } rk %= mod; printf("%d\n", (rk * cnt + 1) % mod); return 0; }
- 1
信息
- ID
- 3725
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 6
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者