ソル:
#include <cstdioを> する#include <iostreamの> する#include <アルゴリズム> の#include <CStringの> に#define LL長い長 の#define N 100005 の#defineは 2150527国防省 使用して 名前空間STDを、 INT [N] [ 10 ]、ビン[ 10 ]、HD [MOD + 10 ]、VIS [MOD + 10 ]、C [ 10 ] [ 10 ]、合計[N]、NXT [N]、N、M。 LLヴァル[N]。 ボイドプレ() { 用(INT iが= 0 ; I <= 6 ; I ++ ) C [i]は[0 ] = C [i]は[I] = 1 。 以下のために(INT iは= 1 ; I <= 6 ; I ++ ) のための(INT J = 1、J <I、J ++ ) C [I] [J] = C [I- 1 ] [J- 1 ] + C [I - 1 ] [J]。 } LL CALC(INT ST) { LL ANS = 0。int型 TOT = 0 ; 以下のために(INT iが= 1 ; I <= N; I ++)// 枚举行 { LL TMP= 0 ; int型J、K; のため(J = 1 ; J <= 6 ; J ++)// 6つの数字の行ごと // 我々の列挙の範囲内のどのような月を見るために IF(ST&ビン[J- 1 ] ) TMP = TMP * 1000003 + A [I]、[J]; J = TMP%MOD; J < 0 J + = MOD:?1。; IF(VIS [J] =!ST) { VIS [J] = ST; HD [J] = 0 ; } ため(K = HD [J]; K; K = NXT [K]) { 場合(ヴァル[K] == TMP) { ANS + = 和[K]。 和[K] ++ ; 休憩; } } もし(!K) { ヴァル[ ++ TOT = TMP。 【TOT]和 = 1 。 NXT [TOT] = HD [J]。 HD [J] = TOT。 } } 戻りANSを、 //我々の列挙の月に、数が等しくなるN行の統計、 } int型のmain() { scanfの(" %Dの%のD "、およびN-、&M) のための(INT I = 1 ; I <= I ++; N- ) のための(INT J = 1。 ; J <= 6。 ; J ++ ) scanfの(" %のD "、&A [I] [J]); ビン[ 0 ] = 1 ; 予め(); のための(INT I = 。1 ; I <= 8 ; I ++ ) ビン[I]ビン= [I- 1 ] << 1 ; LL ANS = 0 ; のために(int型は、私は= 0 ; I < 64 ; I ++ ) // 列挙月、統計がNラインのために、彼らは月の数を持っているもので、私互いに等しい // 私は、少なくとも互いにヶ月に等しいように、他の月の統計ので { INT = CNT 0 ; のための(INT J = 0 ; J < 6。、J ++)// ルック月有効を有しますいくつかの IF(I&ビン[J]) CNT ++ ; IF(CNT < M) 続けて、 LL T = CALC(I)* C [CNT] [M]。 もし((CNT-M)%2 ) 年 - = T。 それ以外の 年 + = T; } Coutを << 年。 リターン 0 ; }