hdu 4810 Wall Painting

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

把每一个数转化二进制,然后统计n个数在每一位的1的个数。奇数个1异或才能得1,然后用组合数,计算。

 1 #include <cstdio>

 2 #include <cstring>

 3 #include <algorithm>

 4 using namespace std;

 5 const int mod=1000003;

 6 

 7 int n;

 8 __int64 a[1100],num[1100],c[1100][1100],ans[1100];

 9 

10 void inti()

11 {

12     for(int i=0; i<1100; i++)

13     {

14          c[i][0]=1;

15          for(int j=1; j<=i; j++)

16          {

17              c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;

18          }

19     }

20 }

21 

22 int main()

23 {

24     inti();

25     while(scanf("%d",&n)!=EOF)

26     {

27         memset(num,0,sizeof(num));

28         memset(ans,0,sizeof(ans));

29         for(int i=1; i<=n; i++)

30         {

31             scanf("%I64d",&a[i]);

32         }

33         for(int i=0; i<=30; i++)

34         {

35             for(int j=1; j<=n; j++)

36             {

37                 if(a[j]&(1<<i)) num[i]++;

38             }

39         }

40         for(int i=0; i<=30; i++)

41         {

42             for(int j=1; j<=n; j++)

43             {

44                 __int64 x=n-num[i];

45                 if(num[i]==0) continue;

46                 for(int k=1; k<=num[i]; k+=2)

47                 {

48                     if(j-k<=x&&j>=k)

49                     {

50                         ans[j]+=((c[num[i]][k]*c[x][j-k]%mod)*(1<<i))%mod;

51                         ans[j]%=mod;

52                     }

53                 }

54             }

55         }

56         printf("%I64d",ans[1]);

57         for(int j=2; j<=n; j++)

58         {

59             printf(" %I64d",ans[j]);

60         }

61         printf("\n");

62     }

63     return 0;

64 }
View Code

 

你可能感兴趣的:(paint)