HDU-4810-벽 그림 (바이너리, 조합의 수)

링크 :

https://vjudge.net/problem/HDU-4810

질문의 의미 :

Ms.Fang 매우 그림을 좋아한다. 그녀는 GFW (위대한 재미 벽) 매일을 그린다. 매일 그림 그리기 전에, 그녀는 물을 혼합하여 안료의 멋진 색상과 안료의 일부 가방을 생산하고 있습니다. k 번째 날, 그녀는 K에게 안료의 특정 부대를 선택하고 그녀가 그 날 사용하는 안료의 색상을 얻을 수를 혼합합니다. 그녀는 색상 A를 안료의 가방과 컬러 B와 안료의 가방을 혼합 할 때, 그녀는 컬러와 함께 배타적 B를 안료를 얻을 것이다
그녀는 같은 색 안료의 두 개의 가방을 혼합 할 때, 그녀는 이상한 이유로 색상 제로를 얻을 것이다 . 이제 그녀의 남편 Mr.Fang는 안료의 K 가방 Ms.Fang는 K 번째 날에 선택되는에 대해 아무 생각이 없습니다. 그는 Ms.Fang 다른 계획을 얻을 것이다 색상의 합을 생각해 본다.

예를 들어, n은 가정 = 3, K = 2, 색상 2, 1, 2와 안료의 세 봉지 그녀는 3 개 가지 계획 색상 3, 3, 0 얻을 수 있습니다. 이 경우, Mr.Fang 두 번째 날에하고 싶어 대답은 '3 + 3 + 0 = 6이
Mr.Fang 그가 거기에 너무 많은 시간을 보내고 싶어하지 않도록 사용 중입니다. 당신은 그를 도와 드릴까요?
당신은 n 번째 날 첫 날부터 대답 Mr.Fang을 말해야한다.

아이디어 :

, XOR을마다 각 이진의 선택에 대한 저장, 홀수 하나를 선택 이진 정수 변환 만 값
조합의 각 열거 옵션 정수입니다.

코드 :

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
//#include <memory.h>
#include <queue>
#include <set>
#include <map>
#include <algorithm>
#include <math.h>
#include <stack>
#include <string>
#include <assert.h>
#include <iomanip>
#define MINF 0x3f3f3f3f
using namespace std;
typedef long long LL;

const int MAXN = 1e3+10;
const int MOD = 1e6+3;
LL a[MAXN];
LL C[MAXN][MAXN];
LL Num[100];
int n;

int main()
{
    C[0][0] = 1;
    C[1][0] = C[1][1] = 1;
    for (int i = 2;i < MAXN;i++)
    {
        C[i][0] = C[i][i] = 1;
        for (int j = 1;j < i;j++)
            C[i][j] = (C[i-1][j]+C[i-1][j-1])%MOD;
    }
    ios::sync_with_stdio(false);
    cin.tie(0);
    int t;
    while (cin >> n)
    {
        memset(Num, 0, sizeof(Num));
        for (int i = 1;i <= n;i++)
        {
            LL v;
            int cnt = 0;
            cin >> v;
            while (v)
            {
                Num[cnt++] += v%2;
                v >>= 1;
            }
        }
        for (int i = 1;i <= n;i++)
        {
            LL res = 0;
            for (int j = 31;j >= 0;j--)
            {
                LL tmp = 0;
                for (int k = 1;k <= i;k += 2)
                    tmp = (tmp + (1LL*C[Num[j]][k]*C[n-Num[j]][i-k])%MOD)%MOD;
                res = (res + (1LL*tmp*(1LL<<j))%MOD)%MOD;
            }
            if (i == n)
                cout << res;
            else
                cout << res << ' ' ;
        }
        cout << endl;
    }

    return 0;
}

추천

출처www.cnblogs.com/YDDDD/p/11374815.html