hdu 4810 位运算+组合数学

题意

n个数,第 i i 输出求从n个数里选 i i 个数异或求和
因为异或只与每一位有关,并不产生进位,所以我们可以对每个数转化成二进制,统计每一位上1的个数
由于只有奇数个1可以贡献1
然后对于每一位一共 n u m [ j ] num[j] 个1,然后我们需要奇数个1,我们枚举奇数k,这个贡献是:
C n u m [ j ] k C n n u m [ j ] i k C_{num[j]}^{k}*C_{n-num[j]}^{i-k}

n个数里选i个数的总贡献为: j = 1 k = 1 , k i C n u m [ j ] k C n n u m [ j ] i k \sum_{j=1}\sum_{k=1, k\in 奇数}^{i}C_{num[j]}^{k}*C_{n-num[j]}^{i-k}

#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");
        }
    }
}

原创文章 83 获赞 6 访问量 2752

猜你喜欢

转载自blog.csdn.net/qq_43101466/article/details/102712047