Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4368 Accepted Submission(s): 1474 Problem Description Ms.Fang loves painting very much. She paints GFW(Great Funny Wall) every day. Every day before painting, she produces a wonderful color of pigments by mixing water and some bags of pigments. On the K-th day, she will select K specific bags of pigments and mix them to get a color of pigments which she will use that day. When she mixes a bag of pigments with color A and a bag of pigments with color B, she will get pigments with color A xor B.
Input There are several test cases, please process till EOF.
Output For each test case, output N integers in a line representing the answers(mod 106 +3) from the first day to the n-th day.
Sample Input 4 1 2 10 1
Sample Output 14 36 30 8
Source
Recommend liuyiding
|
题目大意:给出n个数,并且也代表着总共有n天,第k天就从这n个数中选出k个数进行异或,然后将所有不同方案的异或值相加输出即可。
思路:参考了别人的思路,具体基本上就是这样的,
这4个数的二进制表示分别为:
0001
0010
1010
0001
比如第2天的时候, 从4个中选出2个来做异或,第4位上只有1个1,所以有3中选法可以使得这一位异或之后结果为1,(也就是C(3,1) * C(1,1)),第3位的没有1,所以异或结果一定为0,第2位上又2个1,所以有4种选法,同理第一位上也是4种。
所以其结果就是 (1<<3)*C(3,1) + 0 * C(4,2) + (1<<1)*C(2,1)*C(2,1) + (1<<0)*C(2,1)*C(2,1)
代码:
#include <cmath>
#include <string>
#include <cstdio>
#include <fstream>
#include <cstring>
#include <iostream>
#include <algorithm>
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<<i))
{
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' : ' ');
}
}
}