結果

問題 No.462 6日知らずのコンピュータ
ユーザー tenten
提出日時 2020-09-12 21:04:39
言語 Java
(openjdk 23)
結果
AC  
実行時間 145 ms / 2,000 ms
コード長 1,414 bytes
コンパイル時間 2,730 ms
コンパイル使用メモリ 84,140 KB
実行使用メモリ 54,524 KB
最終ジャッジ日時 2025-01-02 14:20:15
合計ジャッジ時間 17,232 ms
ジャッジサーバーID
(参考情報)
judge1 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 84
権限があれば一括ダウンロードができます

ソースコード

diff #

import java.util.*;

public class Main {
    static final int MOD = 1000000007;
	public static void main (String[] args) {
    	Scanner sc = new Scanner(System.in);
    	int n = sc.nextInt();
    	int k = sc.nextInt();
    	Num[] numbers = new Num[k + 2];
    	numbers[0] = new Num(0);
    	for (int i = 1; i <= k; i++) {
    	    numbers[i] = new Num(sc.nextLong());
    	}
    	numbers[k + 1] = new Num((1L << n) - 1);
    	Arrays.sort(numbers);
    	long ans = 1;
    	for (int i = 1; i <= k + 1; i++) {
    	    if ((numbers[i - 1].number & numbers[i].number) != numbers[i - 1].number) {
    	        System.out.println(0);
    	        return;
    	    }
    	    ans *= kaijo(numbers[i].getPop() - numbers[i - 1].getPop());
    	    ans %= MOD;
    	}
    	System.out.println(ans);
	}
	
	static class Num implements Comparable<Num> {
	    long number;
	    int pop;
	    
	    public Num(long number) {
	        this.number = number;
	        while (number > 0) {
	            pop += number % 2;
	            number /= 2;
	        }
	    }
	    
	    public int getPop() {
	        return pop;
	    }
	    
	    public int compareTo(Num another) {
	        return pop - another.pop;
	    }
	    
	    public String toString() {
	        return number + ":" + pop;
	    }
	}
	
	static long kaijo(long x) {
	    if (x == 0) {
	        return 1;
	    } else {
	        return x * kaijo(x - 1) % MOD;
	    }
	}
}
0