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.When she mixes two bags of pigments with the same color, she will get color zero for some strange reasons. Now, her husband Mr.Fang has no idea about which K bags of pigments Ms.Fang will select on the K-th day. He wonders the sum of the colors Ms.Fang will get with
different plans.
FZ??http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vciBleGFtcGxlLCBhc3N1bWUgbiA9IDMsIEsgPSAyIGFuZCB0aHJlZSBiYWdzIG9mIHBpZ21lbnRzIHdpdGggY29sb3IgMiwgMSwgMi4gU2hlIGNhbiBnZXQgY29sb3IgMywgMywgMCB3aXRoIDMgZGlmZmVyZW50IHBsYW5zLiBJbiB0aGlzIGluc3RhbmNlLCB0aGUgYW5zd2VyIE1yLkZhbmcgd2FudHMgdG8gZ2V0IG9uIHRoZSBzZWNvbmQgZGF5IGlzIDMgJiM0MzsgMyAmIzQzOyAwID0gNi4gPGJyPgpNci5GYW5nIGlzIHNvIGJ1c3kgdGhhdCBoZSBkb2VzbqGvdCB3YW50IHRvIHNwZW5kIHRvbyBtdWNoIHRpbWUgb24gaXQuIENhbiB5b3UgaGVscCBoaW0/IDxicj4KWW91IHNob3VsZCB0ZWxsIE1yLkZhbmcgdGhlIGFuc3dlciBmcm9tIHRoZSBmaXJzdCBkYXkgdG8gdGhlIG4tdGggZGF5LgogCgoKCjxwIGNsYXNzPQ=="pst"> Input There are several test cases, please process till EOF.
For each test case, the first line contains a single integer N(1 <= N <= 10 3).The second line contains N integers. The i-th integer represents the color of the pigments in the i-th bag.
Output
For each test case, output N integers in a line representing the answers(mod 10 6 +3) from the first day to the n-th day.Sample Input
4 1 2 10 1
Sample Output
14 36 30 8题意:给你n和k,求分别从n个中选择k个异或和
思路:首先知道0和1异或是不会影响结果的,只有1和1异或且1的个数是奇数的时候才会对结果产生影响,所以我们把每个数都转换成二进制,统计每一位上的1的个数,利用组合数学解决
#include#include #include #include typedef long long ll; using namespace std; const int maxn = 1005; const ll mod = 1000003; ll C[maxn][maxn], ans[maxn]; int n, cnt[maxn]; void init() { for (int i = 0; i <= 1001; i++) C[i][0] = C[i][i] = 1; for (int i = 2; i <= 1001; i++) for (int j = 1; j < i; j++) C[i][j] = (C[i-1][j] + C[i-1][j-1]) % mod; } void cal(int x) { int cur = 0; while (x) { if (x & 1) cnt[cur]++; cur++; x >>= 1; } } int main() { init(); int x; while (scanf("%d", &n) != EOF) { memset(cnt, 0, sizeof(cnt)); memset(ans, 0, sizeof(ans)); for (int i = 1; i <= n; i++) { scanf("%d", &x); cal(x); } for (int i = 1; i <= n; i++) for (int j = 0; j < 32; j++) for (int k = 1; k <= i; k += 2) { ans[i] += (C[cnt[j]][k] % mod * C[n-cnt[j]][i-k] % mod) * (1<