結果
問題 | No.462 6日知らずのコンピュータ |
ユーザー |
![]() |
提出日時 | 2016-12-13 01:16:49 |
言語 | C#(csc) (csc 3.9.0) |
結果 |
AC
|
実行時間 | 28 ms / 2,000 ms |
コード長 | 5,163 bytes |
コンパイル時間 | 1,030 ms |
コンパイル使用メモリ | 117,456 KB |
実行使用メモリ | 25,980 KB |
最終ジャッジ日時 | 2024-11-29 23:57:40 |
合計ジャッジ時間 | 5,443 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 84 |
コンパイルメッセージ
Microsoft (R) Visual C# Compiler version 3.9.0-6.21124.20 (db94f4cc) Copyright (C) Microsoft Corporation. All rights reserved.
ソースコード
using System;using System.Collections;using System.Collections.Generic;using System.Linq;using System.Text;using System.IO;class TEST{static void Main(){Sol mySol =new Sol();mySol.Solve();}}class Sol{public void Solve(){long mod = (long)1e9 + 7;long[] Fact = new long[N+1];Fact[0] = 1;for(int i=1;i<=N;i++){Fact[i] = Fact[i-1] * i;Fact[i] %= mod;}if(K==0){Console.WriteLine(Fact[N]);return;}Array.Sort(A);int[] bc = new int[N];int tot = N;long ans = 1;for(int i=0;i<K;i++){long inc = A[i];if(i>0) inc -= A[i-1];int cnt = 0;for(int j=0;j<N;j++){if(((inc >> j)&1) == 1){ bc[j]++; cnt++;}if(bc[j]>1){Console.WriteLine(0);return;}}ans *= Fact[cnt];ans %= mod;tot -= cnt;}ans *= Fact[tot];ans %= mod;Console.WriteLine(ans);}int N,K;long[] A;public Sol(){using(var r = new FastIn()){N = r.ReadInt();K = r.ReadInt();if(K>0){A = new long[K];for(int i=0;i<K;i++) A[i] = r.ReadLong();}}}static String rs(){return Console.ReadLine();}static int ri(){return int.Parse(Console.ReadLine());}static long rl(){return long.Parse(Console.ReadLine());}static double rd(){return double.Parse(Console.ReadLine());}static String[] rsa(char sep=' '){return Console.ReadLine().Split(sep);}static int[] ria(char sep=' '){return Array.ConvertAll(Console.ReadLine().Split(sep),e=>int.Parse(e));}static long[] rla(char sep=' '){return Array.ConvertAll(Console.ReadLine().Split(sep),e=>long.Parse(e));}static double[] rda(char sep=' '){return Array.ConvertAll(Console.ReadLine().Split(sep),e=>double.Parse(e));}}class FastIn:IDisposable {int Size;byte[] Mem;int ptr;int rsize;bool unfinished;Stream stdin;void Init(int n) {Size = n;Mem = new byte[Size];rsize=(stdin=Console.OpenStandardInput()).Read(Mem, 0, Size);ptr = 0;unfinished=(rsize == Size);}void Next() {if (unfinished == false) return;rsize=stdin.Read(Mem, 0, Size);ptr = 0;unfinished = (rsize == Size);}~FastIn(){stdin.Dispose();}void IDisposable.Dispose(){stdin.Dispose();}public void Dispose(){stdin.Dispose();}public FastIn() {Init(100000);}public FastIn(int n) {Init(n);}public int ReadInt() {int ret = 0;int sig = 1;while (ptr < rsize && Mem[ptr] != ' ' && Mem[ptr] != '\n' && Mem[ptr] != '\r' ) {if(ret==0 && Mem[ptr] == '-'){sig *= -1; ptr++; continue;}ret = ret * 10 + Mem[ptr++] - '0';if (ptr == Size) Next();}while (ptr < rsize && (Mem[ptr] == ' ' || Mem[ptr] == '\n' || Mem[ptr] == '\r') ) {ptr++;if (ptr == Size) Next();}return ret*sig;}public uint ReadUint() {uint ret = 0;uint sig = 1;while (ptr < rsize && Mem[ptr] != ' ' && Mem[ptr] != '\n' && Mem[ptr] != '\r' ) {ret = ret * 10 + Mem[ptr++] - '0';if (ptr == Size) Next();}while (ptr < rsize && (Mem[ptr] == ' ' || Mem[ptr] == '\n' || Mem[ptr] == '\r') ) {ptr++;if (ptr == Size) Next();}return ret*sig;}public long ReadLong() {long ret = 0;long sig = 1;while (ptr < rsize && Mem[ptr] != ' ' && Mem[ptr] != '\n' && Mem[ptr] != '\r' ) {if(ret==0 && Mem[ptr] == '-'){sig *= -1; ptr++; continue;}ret = ret * 10 + Mem[ptr++] - '0';if (ptr == Size) Next();}while (ptr < rsize && (Mem[ptr] == ' ' || Mem[ptr] == '\n' || Mem[ptr] == '\r') ) {ptr++;if (ptr == Size) Next();}return ret*sig;}public double ReadDouble() {double ret = 0;double sig = 1;bool dot = false;double keta = 0.1;while (ptr < rsize && Mem[ptr] != ' ' && Mem[ptr] != '\n' && Mem[ptr] != '\r' ) {if(ret==0 && Mem[ptr] == '-'){sig *= -1; ptr++;if (ptr == Size) Next();continue;}if(Mem[ptr] == '.'){dot = true;ptr++;if (ptr == Size) Next();continue;}if(!dot){ret = ret * 10 + Mem[ptr++] - '0';if (ptr == Size) Next();}else{ret = ret + (Mem[ptr++] - '0')*keta;keta /= 10.0;if (ptr == Size) Next();}}while (ptr < rsize && (Mem[ptr] == ' ' || Mem[ptr] == '\n' || Mem[ptr] == '\r') ) {ptr++;if (ptr == Size) Next();}return ret*sig;}public String ReadStr() {//2byte文字はNGStringBuilder sb = new StringBuilder();while (ptr < rsize && Mem[ptr] != ' ' && Mem[ptr] != '\n' && Mem[ptr] != '\r') {sb.Append((char)Mem[ptr++]);if (ptr == Size && unfinished) Next();}while (ptr < rsize && (Mem[ptr] == ' ' || Mem[ptr] == '\n' || Mem[ptr] == '\r') ) {ptr++;if (ptr == Size && unfinished) Next();}return sb.ToString();}public String ReadLine() {//極力使わない(split/parseするくらいなら上をつかう)StringBuilder sb = new StringBuilder();while (ptr < rsize && Mem[ptr] != '\n' && Mem[ptr] != '\r') {sb.Append((char)Mem[ptr++]);if (ptr == Size && unfinished) Next();}while (ptr < rsize && (Mem[ptr] == ' ' || Mem[ptr] == '\n' || Mem[ptr] == '\r')) {ptr++;if (ptr == Size && unfinished) Next();}return sb.ToString();}}