题目很简单。
给你n个数,输出n个答案,第i个答案表示从n个数里取遍i个数的异或值的和。
其实每一个数最多也就32位,把所有的数分解,保存每一位总共有多少个1,最后要是这一位的异或结果为1,那么在所有的异或数中,这一位为1的数必须是有奇数个,在求解的时候就是求组合数的情况就可以了。
直接水过。
#include#include #include #define M 1000003#define maxn 1005typedef long long ll;using namespace std;int a[53];int ans,n,m,k,c[maxn][maxn],u[53];ll tep;void insert(int x){ for (int cur=1; x; cur++,x>>=1) a[cur]+=x&1;}void init_c(){ u[1]=1; for (int i=2; i<=52; i++) u[i]=(u[i-1]+u[i-1])%M; c[0][0]=1; c[1][0]=c[1][1]=1; for (int i=2; i n-a[j]) continue; tep=(ll)c[a[j]][k]*c[n-a[j]][i-k]; tep%=M; tep=(tep*u[j])%M; ans+=tep; if (ans>=M) ans-=M; } } if (i>1) printf(" "); printf("%d",ans); } printf("\n"); } return 0;}