【位运算】 HDU 4810 Wall Painting
给出 N 个数
每第 i 天 任取 i 个数进行 位运算 输出所以结果的和
#include <cstdio> #include <cstring> #include <cstdlib> #include <string> #include <iostream> #include <algorithm> #include <sstream> #include <cmath> using namespace std; #include <queue> #include <stack> #include <vector> #include <deque> #define cler(arr, val) memset(arr, val, sizeof(arr)) #define FOR(i,a,b) for(int i=a;i<=b;i++) #define IN freopen ("in.txt" , "r" , stdin); #define OUT freopen ("out.txt" , "w" , stdout); typedef long long LL; const int MAXN = 120000; const int MAXM = 200000; const int INF = 0x3f3f3f3f; const int mod = 1000003; const double eps= 1e-8; #define lson l,m, rt<<1 #define rson m+1,r,rt<<1|1 LL one[200]; LL c[1002][1002]; void solve(int x) { int tol=0; while(x) { int a=x%2; x/=2; if(a) one[tol]++; tol++; } } int main() { #ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); //freopen("out.txt", "w", stdout); #endif cler(c,0); for(int i=0;i<=1000;i++) c[i][0]=1; for(int i=1;i<=1000;i++) { for(int j=1;j<=1000;j++) { c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod; } } int n; int a; while(scanf("%d",&n)!=EOF) { cler(one,0); for(int i=0;i<n;i++) { cin>>a; solve(a); } for(int i=1;i<=n;i++) { LL ans=0; for(int j=0;j<31;j++) for(int k=1;k<=one[j]&&k<=i;k+=2) ans=(ans+(c[one[j]][k]*c[n-one[j]][i-k]%mod*((LL)1<<j))%mod)%mod; printf("%I64d",ans); if(i==n)puts(""); else printf(" "); } } return 0; }