hdu4810组合数学

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Scanner;
import java.util.Stack;
import java.util.StringTokenizer;

public class Main {

        public static void main(String[] args) throws IOException{
                StreamTokenizer cin = new StreamTokenizer(new BufferedInputStream(System.in)); 
                InputReader in = new InputReader(System.in)  ;
                PrintWriter out = new PrintWriter(System.out) ;

                while(cin.nextToken() != cin.TT_EOF){
                     int n = (int)cin.nval ;
                     new Task().solve(n, cin, out) ;  
                    // out.flush();
                }
                out.flush() ;
        }

}


class Task{
      static long[][]  C = new long[1001][1001] ;
      static long[] pow2 = new long[32] ;
      static long mod = 1000003L ;

      static{
            C[0][0] = C[1][0] = C[1][1] = 1L ;
            for(int i = 2 ; i <= 1000 ; i++){
                 C[i][0] = C[i][i] = 1L ;
                 for(int j = 1 ; j < i ; j++){
                      C[i][j] = C[i-1][j-1] + C[i-1][j] ;
                      if(C[i][j] >= mod) C[i][j] %= mod ;
                 }
            }

            for(int i = 0 ; i <= 31 ; i++) pow2[i] = (1L<<i) % mod ;
     }



     int[] bit = new int[32]  ;
     long[] res ;
     int  n  ; 
     public void  solve(int n , StreamTokenizer cin , PrintWriter out) throws IOException{
               res = new long[n+1] ;
               Arrays.fill(bit, 0) ;
               for(int i = 1 ; i <= n ; i++){
                    cin.nextToken() ; 
                    int a = (int)cin.nval ;
                    for(int j = 0 ; j <= 31 ; j++){
                         if(((1<<j) & a) > 0) bit[j]++ ;
                    }
               }

               Arrays.fill(res, 0) ;
               for(int i = 1 ; i <= n ; i++){
                    for(int b = 0 ; b <= 31 ; b++){
                        for(int k = 1 ; k <= i && k <= bit[b] ; k += 2){
                             res[i] += pow2[b] * C[bit[b]][k] % mod * C[n-bit[b]][i-k] % mod ;
                             res[i] %= mod ;
                        }
                    }
               }

               out.print(res[1]) ;
               for(int i = 2 ; i <= n ; i++) out.print(" " + res[i]) ;
               out.println();  
        }  
}


class InputReader{
    public BufferedReader reader;
    public StringTokenizer tokenizer;

    public InputReader(InputStream stream){
           reader = new BufferedReader(new InputStreamReader(stream), 32768);
           tokenizer = null;
    }

    public String next(){
        while(tokenizer == null || !tokenizer.hasMoreTokens()){
            try{
                tokenizer = new StringTokenizer(reader.readLine());
            }catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
        return tokenizer.nextToken();
    }

    public int nextInt() {
        return Integer.parseInt(next());
    }

    public long nextLong() {
        return Long.parseLong(next());
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值