您的位置:首页 > 其它

hdu4810组合数学

2015-07-15 22:21 288 查看
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());
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: