문제의 의미
n 인 정렬 위치, m은 자매 종을 넣을 수 있습니다. 각각의 위치는 몇 가지 프로그램을 찾을 수 없습니다 보류, 인접한 자매의 특정 조항을 넣을 수 있습니다.
분석
#INCLUDE <비트 / stdc ++ H.> 사용 스페이스 성병; 타입 정의 긴 긴 LL; LL의 qmul (LL의 X, Y의 LL, LL의 P) { // 快速乘 X (%) = (P); Y의 (%) = (P); LL ANS = 0 ; 반면 (Y) { 경우 (Y & 1 ) { ANS + = X; 경우 (ANS> = P) = P ans-; // 这样写不能有负数 } X << = 1 ; 만약 (x> = P) = X- P; 예 >> =1 ; } 반환 ANS; } 구조체 매트 { INT의 R, C; LL의 m [ 110 ] [ 110 ]; 매트 () { memset 함수 (m, 0 , 는 sizeof (m)); } }; mmul 매트 (매트 X, Y 매트, 피 LL) { 매트 ANS; ans.r = XR; ans.c = YC; 위한 ( int로 I = 0 ; I는 XR을 <내가 ++ ) 대 ( INT K = 0 ; K <XC를 k 번째 ++ ) 에 대해( INT의 J = 0 ; J <YC, J ++ ) { ans.m [I] [J] + = qmul (XM [I] [K], YM [K] [J], P); 만약 = - (ans.m [I] [J]> = P) ans.m [I] [J] , P } 반환 ANS; } 매트 mpow (매트 X, Y의 LL, LL의 P) { 매트 ANS; ans.r = XR; ans.c = XC; 위한 ( int로 난 = 0 ans.m을 [I] [I] =; I <ans.c 난 ++) 1 ; 반면 (Y) { 경우 (Y & 1 ) ANS = mmul (ANS, X, P); 엑스= mmul (X, X, P); Y는 >> = 1 ; } 반환 ANS; } CONST LL 모드 = 1,000,000,007 ; 매트 T하는; INT의 N, m; 문자 S [ 110 ]; INT 의 main () { 는 scanf ( " %의 D % d에 " , N, m); TR = TC + m = 1 ; 위한 ( int로 I = 0 ; I <m은, 내가 ++ ) { 는 scanf ( " %의 S ' , S); 대한 (INT의 J = 0 ; J <m, J ++ ) Tm은 [I] [J] = 1 - ((S) [J] - ' 0 ' ); TM [I] [m] = 1 ; } 에 대해 ( int로 I = 0 ; I <= m; 내가 ++) Tm은 [m] [I] = 1 ; // 补充一类"空妹子" T = mpow (T, N- 1 , 개조); AR = 1 교류 = m + 1 ; 위한 ( int로 I = 0 ; I <= m; 내가 ++) 암 [ 0 ] [I] = 1; = mmul (A, T, 개조); LL ANS = 0 ; 위한 ( int로 I = 0 ; I <= m; 내가 ++) ANS = (ANS + 암 [ 0 ] [I]) % 개조; 의 printf ( " % LLD \ 없음 " , ANS); 반환 0 ; }
질문을 게시 할 장소는 단지 문제에 대한 코드 솔루션을 다른 사람, 그것이 바로 진정한해야 찾을 수 없습니다? ?
참고 링크 : https://blog.csdn.net/FSAHFGSADHSAKNDAS/article/details/52745912