思路:
(1)条件+问题:给定n个数,求其中任意k个数的组合的异或和,k取1~n全部求一遍;
(2)分析:
代码:
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- using namespace std;
-
- typedef long long LL;
- #define MOD (1000000+3)
- #define MAX_N (1000+3)
-
- int n;
- int a[MAX_N], ans[MAX_N], c[MAX_N][MAX_N];
-
- void init()
- {
- c[0][0] = c[1][0] = c[1][1] = 1;
- for (int i = 2; i < MAX_N; i++)
- {
- c[i][0] = 1;
- for (int j = 1; j <= i; j++)
- {
- c[i][j] = (c[i-1][j] + c[i-1][j-1]) % MOD;
- }
- }
-
- return ;
- }
-
- void count(int x)
- {
- for (int i = 0; i < 32; i++)
- {
- if (x & (1<
- {
- a[i]++;
- }
- }
-
- return ;
- }
-
- int main()
- {
- int n;
- init();
- while(scanf("%d",&n)!=EOF)
- {
- memset(a, 0, sizeof(a));
- for(int i=1; i<=n; i++)
- {
- int x;
- cin>>x;
- count(x);
- }
- memset(ans, 0, sizeof(ans));
-
- for(int i=1; i<=n; i++)
- for(int j=0; j<32; j++)
- for(int k=1; k<=a[j]&&k<=i; k+=2)
- ans[i]=(ans[i]+(LL)c[a[j]][k]*c[n-a[j]][i-k]%MOD*((1 << j)%MOD) % MOD) % MOD;
-
- for (int i = 1; i <= n; i++)
- {
- printf("%d%c", ans[i], i == n ? '\n' : ' ');
- }
-
- }
- }