링크 :
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;
}