标签:des style blog http color io os ar for
Description
Input
Output
Sample Input
4 1 2 10 1
Sample Output
14 36 30 8
思路:首先知道0和1异或是不会影响结果的,只有1和1异或且1的个数是奇数的时候才会对结果产生影响,所以我们把每个数都转换成二进制,统计每一位上的1的个数,利用组合数学解决
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> 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<<j) % mod; ans[i] %= mod; } for (int i = 1; i < n; i++) printf("%lld ", ans[i]); printf("%lld\n", ans[n]); } return 0; }
HDU - 4810 Wall Painting(组合数学)
标签:des style blog http color io os ar for
原文地址:http://blog.csdn.net/u011345136/article/details/40323635