P5196 [USACO19JAN] 암소시

주제 배경

USACO19年一月金组第一题

제목 설명

농부 존은 알려져 있지 않다, 예술 자금에 베시도 치열하다! 최근에, 그녀는 많은 위대한 시인을 공부하기 시작, 지금 그녀는 자신의시의 일부를 만들려고 싶어. N (1≤N≤5000) 단어를 이해 베시, 그녀는 그들에게 그녀의시에 기록 될 싶어. 베시 단위로 각 그녀가 아는 단어, 음절의 길이를 계산했다, 그녀는이 말의 다른 부문이 될 것이다 "운율." 단지 이름이지 다른 사람이 같은 단어의 운율에 속하는 각 단어.

베시 M 행 (^ 1≤M≤10 5)의 각시, 각 행은 K (1≤K≤5000) 음절을 구성한다. 또한, 베시의시의 운율은 지정된 패턴을 따라야합니다.

베시는 많은 다른시 먼저 그녀가 쓸 수있는 제약 조건을 충족하는 방법을 알고 싶어요.

입력 형식

입력의 첫 번째 라인은 N, M 및 K. 포함 다음 행 N 개의 정수를 각각 포함하는 열 SI (1≤si≤K) 및 CI (1≤ci≤N). 이것은 인식 할 수있는 길이 베시 (음절 단위)는 SI, CI 속하는 단어의 운율이다 나타낸다.

마지막으로 M 라인은 베시가, 대문자의 EI를 포함하는 각 행을 패턴을 운 원에 대해 설명합니다. 모든 운율 패턴은 동일한 워드 운율 부 끝나야 EI 라인과 동일하다. 에이 값은 다른 라인 운율 단어가 다른 부분으로 끝나야되지 않습니다.

출력 형식

베시는 이러한 제한을 다른시의 수를 충족하기 위해 출력을 작성할 수 있습니다. 이 숫자가 상당히 클 수 있기 때문에, 인계의 1,000,000,007 결과의 수를 계산합니다.

샘플 입출력

입력 # 1
10 3 3 
3 1 
4 1 
3 2 
B
출력 # 1
960

설명 / 팁

이 경우, 베시는 세 단어를 알고있다. 처음 두 단어가 다른 단어와 운율하지, 셋, 넷 음절 음절 지난 3 음절의 단어 길이의 길이를 운율. 그녀는 각 라인에 10 개 음절을 포함, 세 줄의시를 쓰고 싶어하고, 처음과 마지막 행은 운율. 960 개 등시의 총. 121,123,321 다음은 (첫 번째, 두 번째, 세 번째 단어를 나타내는 1,2,3) 요구 사항을 충족하는 시이다.

코드

#INCLUDE <. 비트 / stdc ++ H>
 #DEFINE mm 1,000,000,007
 #DEFINE의 N 5007
 사용  스페이스 성병;
구조체 노드 {
     INT의 S, C; 
} A [N]; 
INT F [N] [N], B [ 27 ]; 
인라인 INT의 PP ( INT의 X, INT의 K) {
     INT (S) = 1 ;
    하면서 (K) {
         경우 (K & 1 ) S = (1LL * S *의 X) % mm; 
        X = (1LL * X * X) %의 mm; 
        K >> = 1 ; 
    }
    돌아 들; 
} 
INT 의 main () 
{ 
    INT의 N, M, K;  C;  길이 의 ANS = 0 , 입술 = 1 ; 
    scanf와 ( " % D % D % D " , 및 N, M, K);
    위한 ( int로 I = 1 ; 나는 <= N; 내가 ++)는 scanf를 ( " % d 개 %의 D ' , A [i]를 .S, & A [I]가 .c);
    위한 ( int로 I = 1 ; I <= m; 내가 ++ ) { 
        scanf와 ( " \ n 개의 %의 C " , 및 C); 
        B [C -' ' + 1 ] ++ ; 
    } 
    F를 [ 0 ] [ 0 ] = 1 ;
    위한 ( int로 I = 0 ; i가 = K를 <I가 ++는 {)
         에 대해 ( INT의 J = 1 ; J <=는 N; J ++ ) {
             경우 (전 .S <= A [J]를 + K) { 
                물질 F 나 + A [J] .S] [A [j]가이 .c = (F [I]이 [ 0 ] + F [내가 [J를 +] .S] [A [J]가 .c]) % mm; 
                F [I는 A [J를 +] .S] [ 0 ] = (F [I] [ 0 ] + F [i가 + A [J] .S] [ 0 ]) % mm;
            } 
        } 
    } 
    에 대해 ( int로 I = 1 ; i가 <= 26 ; I ++ ) {
         경우 ([I] b를!) 계속 ;
         ( INT의 J = 1 ; J <= N; J ++ ) {
             경우 (F [K] [J]) 
                ANS = (ANS + PP (F [K] [J], B [I])) % mm; 
        } 
        입술 = (1LL * * 입술 ANS) % mm, ANS = 0 ; 
    } 
    의 printf ( " %의 LLD " , 해상도);
    반환  0 ; 
}

 

추천

출처www.cnblogs.com/wangyiding2003/p/11569108.html