hdu4810 Wall Painting 【组合数学】
2016-08-08 11:33
316 查看
链接:http://acm.hdu.edu.cn/showproblem.php?pid=4810
题意:有n个数,第i天选出i个数,输出每天所有的i个数的异或值相加。
分析: 在第k天时我们选数的公式C(n,i),但是异或操作只和而进制上的数有关,那么我们将每个数拆成二进制,统计每位1的个数。
比如:
1 ,2,10,1
0| 1,
0, 0, 1 num[0]=2
1| 0,
1, 1, 0 num[1]=2
2| 0 ,0 ,0, 0 num[2]=0
3| 0,
0, 1, 0 num[3]=1
4| 0 ,0 ,0 ,0
我们可以将公式转换成和1有关:C(n,i)=c(num[j],k)*C(n-num[j],i-k)*(1<<j) //组合数学的公式。。
我们可以发现k为奇数的时候对答案才有贡献。 然后统计每位就可以了。
代码:
题意:有n个数,第i天选出i个数,输出每天所有的i个数的异或值相加。
分析: 在第k天时我们选数的公式C(n,i),但是异或操作只和而进制上的数有关,那么我们将每个数拆成二进制,统计每位1的个数。
比如:
1 ,2,10,1
0| 1,
0, 0, 1 num[0]=2
1| 0,
1, 1, 0 num[1]=2
2| 0 ,0 ,0, 0 num[2]=0
3| 0,
0, 1, 0 num[3]=1
4| 0 ,0 ,0 ,0
我们可以将公式转换成和1有关:C(n,i)=c(num[j],k)*C(n-num[j],i-k)*(1<<j) //组合数学的公式。。
我们可以发现k为奇数的时候对答案才有贡献。 然后统计每位就可以了。
代码:
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<string> #include<vector> #include<queue> #include<cmath> #include<stack> #include<set> #include<map> #define INF 0x3f3f3f3f #define Mn 1010 #define Mm 2000005 #define mod 1000003 #define CLR(a,b) memset((a),(b),sizeof((a))) #define CLRS(a,b,Size) memset((a),(b),sizeof((a[0]))*(Size+1)) #define CPY(a,b) memcpy ((a), (b), sizeof((a))) #pragma comment(linker, "/STACK:102400000,102400000") #define ul u<<1 #define ur (u<<1)|1 using namespace std; typedef long long ll; int num[34]; ll c[Mn][Mn]; int main() { c[0][0]=1; for(int i=1;i<Mn;i++) { for(int j=0;j<=i;j++) { c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod; } } int n,a; while(~scanf("%d",&n)) { CLR(num,0); for(int i=1;i<=n;i++) { scanf("%d",&a); for(int j=0;j<32;j++) if(a&(1<<j)) num[j]++; } ll ans=0; for(int i=1;i<=n;i++) { ans=0; for(int j=0;j<32;j++) { for(int k=1;k<=i;k+=2) { ans=(ans+c[num[j]][k]*c[n-num[j]][i-k]%mod*(1<<j)%mod)%mod; } } printf("%I64d",ans); if(i==n) printf("\n"); else printf(" "); } } return 0; }
相关文章推荐
- hdu4810 wall painting 组合数学+位运算
- HDU4810 Wall Painting(组合数学+二进制)
- HDU 4810 Wall Painting(组合数学)
- HDU - 4810 Wall Painting(组合数学)
- hdu 4810 Wall Painting(组合数学)
- HDU - 4810 Wall Painting(组合数学)
- HDU - 4810 Wall Painting(组合数学)
- HDU 4810 Wall Painting(组合数学 + 位运算)——2013ACM/ICPC亚洲区南京站现场赛
- hdoj 4810 Wall Painting 【思维 + 组合数学】
- HDU - 4810 Wall Painting(组合数学)
- HDU - 4810 Wall Painting(组合数学)
- HDU 4810 Wall Painting(组合数学)
- 【HDU 4810】组合数学 Wall painting
- HDU - 4810 Wall Painting(组合数学)
- HDU - 4810 Wall Painting(组合数学)
- hdu 4810 Wall Painting (组合数学+二进制)
- hdu 4810 Wall Painting(组合数学)
- HDU - 4810 Wall Painting(组合数学)
- HDU - 4810 Wall Painting(组合数学)
- HDU - 4810 Wall Painting(组合数学)