CF1614C Divan and bitwise operations
题目大意
有一个未知的序列 ,现知道 个信息,每个星信息为 l r x
的形式给出,表示区间 的按位或为 ,保证 中每一个数都被包含在区间 至少一次。
请输出序列 的所有子序列的异或和 。
共 组数据。
对于 的数据,保证 。
解题思路
显然,我们可以得到整个序列的按位或就是所有 的按位或,设为 。
如果 的第 位为 ,贡献即为 。
否则总有一个 ,当中恰有一个对应贡献为 ,总贡献为 。
那么 。
时间复杂度 。
具体实现见代码。
CODE
#include <bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
int s = 0, w = 1;
char c = getchar();
for (; !isdigit(c); c = getchar())
if (c == '-')
w = -1;
for (; isdigit(c); c = getchar())
s = (s << 1) + (s << 3) + (c ^ 48);
return s * w;
}
const int mod = 1e9 + 7;
inline int qpow(int x, int y)
{
int res = 1;
while (y)
{
if (y & 1)
res = res * x % mod;
x = x * x % mod;
y >>= 1;
}
return res;
}
int T, n, m;
signed main()
{
T = read();
while (T--)
{
n = read(), m = read();
int ans = 0;
while (m--)
{
read(), read();
ans = ans | read();
}
ans = ans * qpow(2, n - 1) % mod;
printf("%lld\n", ans);
}
return 0;
}
本文来自博客园,作者:蒟蒻orz,转载请注明原文链接:https://www.cnblogs.com/orzz/p/18122077