题意
n个数,第
输出求从n个数里选
个数异或求和
因为异或只与每一位有关,并不产生进位,所以我们可以对每个数转化成二进制,统计每一位上1的个数
由于只有奇数个1可以贡献1
然后对于每一位一共
个1,然后我们需要奇数个1,我们枚举奇数k,这个贡献是:
n个数里选i个数的总贡献为:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
template <typename T>
void out(T x) { cout << x << endl; }
ll fast_pow(ll a, ll b, ll p) {ll c = 1; while(b) { if(b & 1) c = c * a % p; a = a * a % p; b >>= 1;} return c;}
ll exgcd(ll a, ll b, ll &x, ll &y) { if(!b) {x = 1; y = 0; return a; } ll gcd = exgcd(b, a % b, y, x); y-= a / b * x; return gcd; }
const int N = 1e3 + 5;
const int mod = 1e6 + 3;
ll fac[N], inv[N];
int num[N];
void init()
{
fac[0] = inv[0] = 1;
for(int i = 1; i < N; i ++)
fac[i] = fac[i - 1] * i % mod;
inv[N - 1] = fast_pow(fac[N - 1], mod - 2, mod);
for(int i = N - 2; i >= 1; i --)
inv[i] = inv[i + 1] * (i + 1) % mod;
}
ll C(int n, int m)
{
if(n < m)
return 0;
return fac[n] * inv[m] % mod * inv[n - m] % mod;
}
int div(int x)
{
int cnt = 0;
while(x)
{
++ cnt;
if(x % 2)
num[cnt] ++;
x /= 2;
}
return cnt;
}
int main()
{
ios::sync_with_stdio(false);
int n;
init();
while(cin >> n)
{
fill(num, num + N, 0);
int m = 0;
for(int i = 1; i <= n; i ++)
{
int x;
cin >> x;
m = max(div(x), m);
}
for(int i = 1; i <= n; i ++)
{
ll ans = 0;
for(int j = 1; j <= m; j ++)
{
ll sum = 0;
for(int k = 1; k <= i; k += 2)
{
sum = (sum + C(num[j], k) * C(n - num[j], i - k) % mod) % mod;
}
ans = (ans + sum * fast_pow(2, j - 1, mod) % mod) % mod;
}
cout << ans << (i != n ? " " : "\n");
}
}
}