博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU4810_Wall Painting
阅读量:5276 次
发布时间:2019-06-14

本文共 979 字,大约阅读时间需要 3 分钟。

题目很简单。

给你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;}

 

转载于:https://www.cnblogs.com/lochan/p/3451788.html

你可能感兴趣的文章