您的位置:首页 > 大数据 > 人工智能

HDU-4810 Wall Painting

2015-07-31 20:28 531 查看

题目:

http://acm.hdu.edu.cn/showproblem.php?pid=4810

题意:

给出n种颜色,求1到n种颜色混合产生的颜色种类和。

颜色混合就是对应数字异或;

第k个答案就是在n种颜色中随机挑选k个进行混合的全部结果之和。

思路:

位运算,按位异或之和等于各数字异或和;

数据小,直接打表组合数,然后按位求得所有可能数,详见code;

代码:

#define MOD 1000003
#define N 1123

int n,m;
int flag,res;
long long sum,ans,t;
long long a
,b
;
long long f

,c

;

void init()
{
memset(f,0,sizeof(f));
for(int i=0;i<N;i++)
f[i][0]=f[i][i]=1;
for(int i=1;i<N;i++)
for(int j=1;j<i;j++)
f[i][j] = (f[i-1][j]+f[i-1][j-1])%MOD;
}
int main()
{
int i,j,k;
init();
while(scanf("%d",&n)!=EOF&&n)
{
memset(b,0,sizeof(b));
res=0;
for(i=0;i<n;i++)
{
scanf("%lld",&t);
j=0;
while(t)
{
if(t&1)
b[j]++;
j++;
t>>=1;
}
}
for(k=1;k<=n;k++)
{
sum = 0;
t = 1;
for(i=0;i<32;i++)
{
ans=0;
for(j=1;j<=k;j+=2)
ans=(ans+(f[b[i]][j]*f[n-b[i]][k-j])%MOD)%MOD;
sum=(sum+ans*t%MOD)%MOD;
t*=2;
}
if(k!=1)printf(" ");
printf("%lld",sum);
}
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: